2

说我有这个代码:

Dictionary<String, String> myDictionary = new Dictionary<String, String>();
Type[] arguments = myDictionary.GetType().GetGenericArguments();

在我的程序中, myDictionary 它的类型未知(它是从反序列化的 XML 返回的对象),但就这个问题而言,它们是字符串。我想创建这样的东西:

Dictionary<arguments[0],arguments[1]> mySecondDictionary = new Dictionary<arguments[0],arguments[1]>();

显然,它不起作用。我在 MSDN 上搜索,我看到他们正在使用 Activator 类,但我不明白。也许有人更高级,可以帮助我一点。

4

3 回答 3

1

这种方法存在问题。我会尽力解释。我编写了一个程序,它首先将一个类序列化为 XML,然后将其反序列化。基本上,它是一个通用类,它包含一个 List(与该类相同的类型)。因此,类的类型可以是任何类型,从简单类型(如 string、int 等)到更复杂的类(如书类或人)。使用 XmlSerializer.Deserialize 方法并获取对象后,我应该使用反射来重建对象并访问列表。而我不能那样做。所以,如果我有类似的东西:

Type classToCreate = typeof(classToBeSerialized<>).MakeGenericType(arguments);
var reconstructedClass = Activator.CreateInstance(classToCreate);

其中classToBeSerialized是假定的类(它有我所说的列表),returnObject是从XmlSerializer.Deserialize返回的对象,我想像这样访问列表:

 ((reconstructedClass)returnedObject).lista

基本上,我使用反射将对象投射到它的源。

于 2013-07-07T20:21:20.060 回答
0

您可以使用您提到的激活器类来从给定类型创建对象。MakeGenericType方法允许您指定一个类型数组作为泛型对象的参数,这是您试图模拟的。

Dictionary<String, String> myDictionary = new Dictionary<String, String>();
Type[] arguments = myDictionary.GetType().GetGenericArguments();

Type dictToCreate = typeof(Dictionary<,>).MakeGenericType(arguments);
var mySecondDictionary = Activator.CreateInstance(dictToCreate);

上面的代码基本上没有意义,因为您知道字典是String,String事先存在的,但假设您有办法在运行时检测其他地方所需的类型,您可以使用最后两行来实例化该类型的字典。

于 2013-07-07T18:32:28.117 回答
0

我知道这是一个旧线程,但我只需要类似的东西,并决定展示它,(你知道谷歌)。

这基本上是@user2536272 对答案的重写

public object ConstructDictionary(Type KeyType, Type ValueType)
{
    Type[] TemplateTypes = new Type[]{KeyType, ValueType};
    Type DictionaryType = typeof(Dictionary<,>).MakeGenericType(TemplateTypes);

    return Activator.CreateInstance(DictionaryType);
}

public void AddToDictionary(object DictionaryObject, object KeyObject, object ValueObject )
{
    Type DictionaryType = DictionaryObject.GetType();

    if (!(DictionaryType .IsGenericType && DictionaryType .GetGenericTypeDefinition() == typeof(Dictionary<,>)))
        throw new Exception("sorry object is not a dictionary");

    Type[] TemplateTypes = DictionaryType.GetGenericArguments();
    var add = DictionaryType.GetMethod("Add", new[] { TemplateTypes[0], TemplateTypes[1] });
    add.Invoke(DictionaryObject, new object[] { KeyObject, ValueObject });
}
于 2016-07-08T11:32:14.183 回答