2011-11-24 128 views
0

我得到了下面的代码创建我的课:提供的类型来实例化一个泛型类

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提前寻求帮助

+1

从你的代码(例如'PrimitivePropertyProxy'和你在哪里使用'GenericObject')中不是很清楚,但是你遇到的问题是'pi.PropertyType'一个**变量**,而不是一个**类型**。 –

+0

编辑我的问题! –

回答

1

你的问题是,pi.PropertyType变量包含代表一个类型,而不是一个自身的类。

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


说实话,我不知道您的泛型类如何更好不仅仅是有一个持有object秒。既然你打算用反射来创建这个泛型类,那么你将不会获得通常使用泛型的类型安全。

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"); 
+0

我不明白为什么有两种类型可以调用MakeGenericType。在我的例子中,“pi.PropertyType”只能是类型Int32,String,Boolean和Double,但是第二种类型使用的是什么? (列表之一) –

+0

我想我明白了,但我仍然不知道如何在我的行中使用它:GenericObject p = new GenericObject (container,pi.Name); 我应该把什么“???” ? –

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); 

(可以这么说)