我創建了<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