2009-09-20 58 views
1

我创建了<T>的列表,但我想知道该T对象的类型。 (我使用反射在我的项目,所以我不知道是什么类型,当我创造我的代码类型的系统。收集<T>

所以首先我有我的List - >List<T>

现在我想该T-对象的所有属性(用于在数据网格列)

任何帮助吗?

回答

0

您可以从该列表中取一个对象,看看它的类型。虽然肯定是有一个更好的办法,我想想。

+1

如果不是所有相同类型的集合呢? – 2009-09-20 18:49:25

+0

@Ahmed - 那么它不是一个明智的名单;实际上,查看列表中的第一项是“IList”不是“ITypedList”时使用的官方回退方法,并且没有非对象索引器。所以这不是一个坏的建议。但是如果从列表本身可以识别出'T' *,那么它是可取的。 – 2009-09-20 19:34:33

+0

这个问题清楚地表明它是一个列表,没有理由为什么列表中的项目将是不同的类型 – 2009-09-20 20:22:12

11

你可以只使用typeof运算(T)在你的类或泛型方法:

void ProcessList<T>(List<T> list) { 
    Type typeOfT = typeof(T); 
    // Work with type... 
} 
+0

如果OP使用反射(问题),那么在事先不知道“T”的情况下调用此方法的方法并不是很好,至少,直到C#4.0(您可以将其用作动态方法,并让运行时间担心它)。 – 2009-09-20 20:39:42

1

对于GetListType函数见this answer。要获得属性列表的数据绑定的目的,你应该使用组件模型(兼容性) - 即

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(type); 

然后看看每个PropertyDescriptor,使用GetValue/Converter等。您的清单代码通常必须针对非通用IList;是这样的:

IList list = ... 
object obj = list[rowIndex]; 
// then for any given "prop" 
object val = prop.GetValue(obj); 
string displayText = prop.Converter.ConvertToString(val); 

不过,如果你想成为“完整”,你想也需要看看IListSourceITypedList

0
values.GetType().GetGenericArguments()[0].FullName 

上面给你的类型对象类型“T”

values.GetType().GetGenericArguments()[0].GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance) 

上面给出了'T'上的公共属性,您可以根据需要传递适当的BindingFlags。