如何将对象转换为某种未知的类类型?

时间:2014-08-05 02:31:21

标签: c#

我们知道,通过反射,我们可以创建一个类实例,但类型是对象。以下是一些示例代码。

  Type type = p.GetType();
  Type keyType = type.GetGenericArguments()[0];
  Type valueType = type.GetGenericArguments()[1];

   var r = Activator.CreateInstance(typeof(SerializableDictionary<,>)
                .MakeGenericType(new Type[] { keyType, valueType })) 
                   as SerializableDictionary<? ,?>;

SerializableDictionary是Dictionary的子类。为什么我要投射这个物体? 因为我想在SerilaizbleDictionary中添加一些元素。这些元素来自另一个角色。

foreach (KeyValuePair<?, ?> kvp in d)// d is another dictionary
{
   r.Add(kvp.Key, kvp.Value);
}

我该怎么做?非常感谢你。

2 个答案:

答案 0 :(得分:1)

如果这些项目来自另一个Dictionary那么您是否可以简单地编写一个通用方法并让它处理泛型类型?

private SerializableDictionary<TKey, TValue> ToSerializable<TKey, TValue>(Dictionary<TKey, TValue> source)
{
    var output = new SerializableDictionary<TKey, TValue>();

    foreach (var key in source.Keys)
    {
        output.Add(key, source[key]);
    }

    return output;
}

答案 1 :(得分:0)

如评论中所述,考虑转换为IDictionary界面。特别是IDictionary.Add方法。

Type type = p.GetType();
Type keyType = type.GetGenericArguments()[0];
Type valueType = type.GetGenericArguments()[1];

var dictionary =
    (IDictionary) Activator
        .CreateInstance(typeof(SerializableDictionary<,>)
        .MakeGenericType(new Type[] { keyType, valueType }));

foreach(var item in stronglyTypedDictionary)
{
    dictionary.Add(item.Key, item.Value);
}

例如:

// Assume dictionary is created using reflection
IDictionary dictionary = new Dictionary<string, object>();
var stronglyTypedDictionary = new Dictionary<string, object> { {"hello", null} };

foreach(var item in stronglyTypedDictionary)
{
    dictionary.Add(item.Key, item.Value);
}

确保dictionarystronglyTypedDictionary之间的类型匹配。