我有以下代码来创建我的类:
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提前获得任何帮助
答案 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);
(可以这么说)