提供的类型来实例化一个泛型类
我得到了下面的代码创建我的课:提供的类型来实例化一个泛型类
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);
}
编译器告诉我,“P1”是不是一个命名空间(???) 我这个代码的尝试:
Type type = pi.PropertyType;
GenericObject<type> p = new GenericObject<type>(container, pi.Name);
,但我得到了同样的错误('类型'不是一个命名空间) 我该怎么办? thx提前寻求帮助
你的问题是,pi.PropertyType
是变量包含代表一个类型,而不是一个型自身的类。
泛型期望类型,而不是变量。您可以根据Jakub的答案动态创建类型,但我不确定那是您想要或需要的。
说实话,我不知道您的泛型类如何更好不仅仅是有一个持有object
秒。既然你打算用反射来创建这个泛型类,那么你将不会获得通常使用泛型的类型安全。
通过将变量传递给<>
,您无法在运行时创建动态类型。
您需要致电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");
我不明白为什么有两种类型可以调用MakeGenericType。在我的例子中,“pi.PropertyType”只能是类型Int32,String,Boolean和Double,但是第二种类型使用的是什么? (列表之一) –
我想我明白了,但我仍然不知道如何在我的行中使用它:GenericObject ??> p = new GenericObject ??>(container,pi.Name); 我应该把什么“???” ? –
万一有人得到了完全相同的问题有一天,这里是解决方案:
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);
(可以这么说)
从你的代码(例如'PrimitivePropertyProxy'和你在哪里使用'GenericObject')中不是很清楚,但是你遇到的问题是'pi.PropertyType'一个**变量**,而不是一个**类型**。 –
编辑我的问题! –