obj 转 Dictionary<string, string>
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了obj 转 Dictionary<string, string>相关的知识,希望对你有一定的参考价值。
关于c# 数据转换的问题!
在做数据抓取的进候需要用到线程池,而这个线程池只能传一个参数,用指定的方法去取, 取的时候默认是转成object的
比如 Dictionary<string, string> demo = new Dictionary<string, string>();
demo.add("type","this is type");
demo.add("more","this is more");
demoStart(demo); (注明:这个demo类型要为Dictionary<string, string>, 因为需求)
取的时候默认是 demoStart(object obj); (注明:为个object是默认的,无法更改)
那么我要怎么通过转换取到 " type " 或者 " more " 里的值! 有没有知道的大神?
Dictionary<string, string> demo1 = new Dictionary<string, string>();
demo1 = (Dictionary<String,String>)obj;
foreach (KeyValuePair<string, string> kvp in demo1)
Console.WriteLine("\t0\t1", kvp.Key, kvp.Value);
static void Main(string[] args)
Dictionary<string, string> demo = new Dictionary<string, string>();
demo.Add("type", "this is type");
demo.Add("more", "this is more");
demoStart(demo);
Console.Read();
追问
直接这样强行转可以吗? 我刚才也试过用这样强行转的。 等我跑完程序试下,谢了!
本回答被提问者采纳如何将对象转换为Dictionary 在C#?
如何在C中将动态对象转换为Dictionary<TKey, TValue>
#我该怎么办?
public static void MyMethod(object obj)
{
if (typeof(IDictionary).IsAssignableFrom(obj.GetType()))
{
// My object is a dictionary, casting the object:
// (Dictionary<string, string>) obj;
// causes error ...
}
else
{
// My object is not a dictionary
}
}
public static KeyValuePair<object, object > Cast<K, V>(this KeyValuePair<K, V> kvp)
{
return new KeyValuePair<object, object>(kvp.Key, kvp.Value);
}
public static KeyValuePair<T, V> CastFrom<T, V>(Object obj)
{
return (KeyValuePair<T, V>) obj;
}
public static KeyValuePair<object , object > CastFrom(Object obj)
{
var type = obj.GetType();
if (type.IsGenericType)
{
if (type == typeof (KeyValuePair<,>))
{
var key = type.GetProperty("Key");
var value = type.GetProperty("Value");
var keyObj = key.GetValue(obj, null);
var valueObj = value.GetValue(obj, null);
return new KeyValuePair<object, object>(keyObj, valueObj);
}
}
throw new ArgumentException(" ### -> public static KeyValuePair<object , object > CastFrom(Object obj) : Error : obj argument must be KeyValuePair<,>");
}
来自OP:
而不是转换我的整个词典,我决定保持我的obj动态一直。当我使用foreach访问我的Dictionary的键和值时,我使用foreach(obj.Keys中的动态键)并简单地将键和值转换为字符串。
据我了解,你不确定键和值是什么,但你想将它们转换成字符串?
也许这可行:
public static void MyMethod(object obj)
{
var iDict = obj as IDictionary;
if (iDict != null)
{
var dictStrStr = iDict.Cast<DictionaryEntry>()
.ToDictionary(de => de.Key.ToString(), de => de.Value.ToString());
// use your dictStrStr
}
else
{
// My object is not an IDictionary
}
}
object parsedData = se.Deserialize(reader);
System.Collections.IEnumerable stksEnum = parsedData as System.Collections.IEnumerable;
然后就可以枚举了!
简单方法:
public IDictionary<T, V> toDictionary<T, V>(Object objAttached)
{
var dicCurrent = new Dictionary<T, V>();
foreach (DictionaryEntry dicData in (objAttached as IDictionary))
{
dicCurrent.Add((T)dicData.Key, (V)dicData.Value);
}
return dicCurrent;
}
我用这个助手:
public static class ObjectToDictionaryHelper
{
public static IDictionary<string, object> ToDictionary(this object source)
{
return source.ToDictionary<object>();
}
public static IDictionary<string, T> ToDictionary<T>(this object source)
{
if (source == null)
ThrowExceptionWhenSourceArgumentIsNull();
var dictionary = new Dictionary<string, T>();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(source))
AddPropertyToDictionary<T>(property, source, dictionary);
return dictionary;
}
private static void AddPropertyToDictionary<T>(PropertyDescriptor property, object source, Dictionary<string, T> dictionary)
{
object value = property.GetValue(source);
if (IsOfType<T>(value))
dictionary.Add(property.Name, (T)value);
}
private static bool IsOfType<T>(object value)
{
return value is T;
}
private static void ThrowExceptionWhenSourceArgumentIsNull()
{
throw new ArgumentNullException("source", "Unable to convert object to a dictionary. The source object is null.");
}
}
用法只是在一个对象上调用.ToDictionary()
希望能帮助到你。
以上答案都很酷。我发现json序列化对象很容易并反序列化为字典。
var json = JsonConvert.SerializeObject(obj);
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
我不知道性能是如何影响的,但这更容易阅读。你也可以将它包装在一个函数中。
public static Dictionary<string, TValue> ToDictionary<TValue>(object obj)
{
var json = JsonConvert.SerializeObject(obj);
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, TValue>>(json);
return dictionary;
}
使用如下:
var obj = new { foo = 12345, boo = true };
var dictionary = ToDictionary<string>(obj);
这应该工作:
数字,字符串,日期等:
public static void MyMethod(object obj)
{
if (typeof(IDictionary).IsAssignableFrom(obj.GetType()))
{
IDictionary idict = (IDictionary)obj;
Dictionary<string, string> newDict = new Dictionary<string, string>();
foreach (object key in idict.Keys)
{
newDict.Add(key.ToString(), idict[key].ToString());
}
}
else
{
// My object is not a dictionary
}
}
如果你的字典还包含一些其他对象:
public static void MyMethod(object obj)
{
if (typeof(IDictionary).IsAssignableFrom(obj.GetType()))
{
IDictionary idict = (IDictionary)obj;
Dictionary<string, string> newDict = new Dictionary<string, string>();
foreach (object key in idict.Keys)
{
newDict.Add(objToString(key), objToString(idict[key]));
}
}
else
{
// My object is not a dictionary
}
}
private static string objToString(object obj)
{
string str = "";
if (obj.GetType().FullName == "System.String")
{
str = (string)obj;
}
else if (obj.GetType().FullName == "test.Testclass")
{
TestClass c = (TestClass)obj;
str = c.Info;
}
return str;
}
public static void MyMethod(object obj){
Dictionary<string, string> dicEditdata = data as Dictionary<string, string>;
string abc=dicEditdata["id"].ToString();}
假设---如果你在调试时将光标放在对象(obj)上,如果你得到一个值为{['id':'ID1003']}
的对象,那么你可以使用该值作为
string abc=dicEditdata["id"].ToString();
假设键只能是一个字符串,但值可以是任何尝试
public static Dictionary<TKey, TValue> MyMethod<TKey, TValue>(object obj)
{
if (obj is Dictionary<TKey, TValue> stringDictionary)
{
return stringDictionary;
}
if (obj is IDictionary baseDictionary)
{
var dictionary = new Dictionary<TKey, TValue>();
foreach (DictionaryEntry keyValue in baseDictionary)
{
if (!(keyValue.Value is TValue))
{
// value is not TKey. perhaps throw an exception
return null;
}
if (!(keyValue.Key is TKey))
{
// value is not TValue. perhaps throw an exception
return null;
}
dictionary.Add((TKey)keyValue.Key, (TValue)keyValue.Value);
}
return dictionary;
}
// object is not a dictionary. perhaps throw an exception
return null;
}
此代码可安全地将Object转换为Dictionary(具有源对象来自Dictionary的前提):
private static Dictionary<TKey, TValue> ObjectToDictionary<TKey, TValue>(object source)
{
Dictionary<TKey, TValue> result = new Dictionary<TKey, TValue>();
TKey[] keys = { };
TValue[] values = { };
bool outLoopingKeys = false, outLoopingValues = false;
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(source))
{
object value = property.GetValue(source);
if (val以上是关于obj 转 Dictionary<string, string>的主要内容,如果未能解决你的问题,请参考以下文章
更新字典 (Updating a Dictionary,UVa12504)
怎么把一个object 型转成 键值对呢? 如 我要做个统一的插入 Add(object obj) ....