提供Type以实例化泛型类

时间:2011-11-24 12:13:46

标签: c# generics

我有以下代码来创建我的类:

public class GenericObject<T>
{
    [...]

    public GenericObject(object source, string propertyName)
    {
        [...]
    }
}

然后我想创建我的类的实例。这是我的循环:

        foreach (PropertyInfo pi in container.GetType().GetProperties())
        {
                //var type = pi.PropertyType;
                GenericObject<pi.PropertyType> p = new GenericObject<pi.PropertyType>(container, pi.Name);
        }

编译器告诉我'pi'不是命名空间(???) 我试过这段代码:

Type type = pi.PropertyType;
GenericObject<type> p = new GenericObject<type>(container, pi.Name);

但我得到了同样的错误('type'不是命名空间) 我该怎么办? thx提前获得任何帮助

3 个答案:

答案 0 :(得分:4)

您无法通过将变量传递给<>来在运行时创建动态类型。

您需要致电 MakeGenericType 并在那里提供您的通用类型。

这是一个例子

Type d1 = typeof(List<>);    
Type[] typeArgs = { typeof(string) };    
Type makeme = d1.MakeGenericType(typeArgs);

object o = Activator.CreateInstance(makeme);    
List<string> itsMe = o as List<string>;    
Console.WriteLine((itsMe == null) ? "Failed" : "Succeeded");

答案 1 :(得分:1)

您遇到的问题是pi.PropertyType是一个变量,它包含一个代表类型的类,而不是类型的自我。

泛型期望一种类型,而不是变量。您可以根据Jakub的答案动态创建类型,但我不确定这是您想要或需要的。


老实说,我不确定你的泛型类比持有object的那个更好。由于您将使用反射创建此泛型类,因此您不会获得通常使用泛型的类型安全性。

答案 2 :(得分:0)

如果某人有一天得到完全相同的问题,这就是解决方案:

        foreach (PropertyInfo pi in container.GetType().GetProperties())
        {
                Type generic = typeof(GenericObject<>);
                Type[] typeArgs = { pi.PropertyType};
                Type constructed = generic.MakeGenericType(typeArgs);
                object[] args = new object[] { container, pi.Name };
                var p = Activator.CreateInstance(constructed, args);
        }

我们可以“近似地”说这相当于我想要的东西:

GenericObject<pi.PropertyType> p = new GenericObject<pi.PropertyType>(container, pi.Name);

(可以这么说)

相关问题