我创建了<T>
的列表,但我想知道该T对象的类型。 (我使用反射在我的项目,所以我不知道是什么类型,当我创造我的代码类型的系统。收集<T>
所以首先我有我的List
- >List<T>
值
现在我想该T-对象的所有属性(用于在数据网格列)
任何帮助吗?
我创建了<T>
的列表,但我想知道该T对象的类型。 (我使用反射在我的项目,所以我不知道是什么类型,当我创造我的代码类型的系统。收集<T>
所以首先我有我的List
- >List<T>
值
现在我想该T-对象的所有属性(用于在数据网格列)
任何帮助吗?
您可以从该列表中取一个对象,看看它的类型。虽然肯定是有一个更好的办法,我想想。
你可以只使用typeof运算(T)在你的类或泛型方法:
void ProcessList<T>(List<T> list) {
Type typeOfT = typeof(T);
// Work with type...
}
如果OP使用反射(问题),那么在事先不知道“T”的情况下调用此方法的方法并不是很好,至少,直到C#4.0(您可以将其用作动态方法,并让运行时间担心它)。 – 2009-09-20 20:39:42
它是那么容易,因为GetType(),然后利用反射为GetProperties()?
对于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);
不过,如果你想成为“完整”,你想也需要看看IListSource
和ITypedList
values.GetType().GetGenericArguments()[0].FullName
上面给你的类型对象类型“T”
values.GetType().GetGenericArguments()[0].GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance)
上面给出了'T'上的公共属性,您可以根据需要传递适当的BindingFlags。
如果不是所有相同类型的集合呢? – 2009-09-20 18:49:25
@Ahmed - 那么它不是一个明智的名单;实际上,查看列表中的第一项是“IList”不是“ITypedList”时使用的官方回退方法,并且没有非对象索引器。所以这不是一个坏的建议。但是如果从列表本身可以识别出'T' *,那么它是可取的。 – 2009-09-20 19:34:33
这个问题清楚地表明它是一个列表,没有理由为什么列表中的项目将是不同的类型 –
2009-09-20 20:22:12