我们知道,通过反射,我们可以创建一个类实例,但类型是对象。以下是一些示例代码。
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);
}
我该怎么做?非常感谢你。
答案 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);
}
确保dictionary
和stronglyTypedDictionary
之间的类型匹配。