首先讓我說,我想要做的是獲取泛型類中的屬性值,該屬性值可以由繼承自類的屬性重寫。可以將它看作是基類中的默認值,類的繼承者可以覆蓋它們以設置它們自己的默認值。如何使用反射創建通用對象
我試圖直接在類型上使用反射,使用System.Reflection.FieldInfo.GetValue但這不適用於具有泛型類型的類。所以我認爲我需要實例化這個類,以便能夠看到它的價值。
我通過讀取bin中的Dll並使用Reflection來查找從我的界面繼承的類型,從而檢索到「類型」。
我使用.NET 4.5
這裏是文檔,似乎像它解釋正是我需要做的 http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx
在本文檔中,我可以看到的唯一的區別是我們如何得到我們的類型,我看着在箱子的類型,他們根本typeof運算()調用,因爲類型是如此複雜,似乎這可能是一個可能不匹配,但我看不出有什麼缺失(如果有的話)
foreach (var item in types)
{
var ts = item.GetField("DefaultTimeToExpire");
Type[] typeArguments = item.GetGenericArguments();
if (ts != null)
{
var t = item.MakeGenericType(typeArguments);
var obj = Activator.CreateInstance(t);
var timespan = obj.DefaultTimeToExpire;
subscriberInfos.Add(new Tuple<string, Type, TimeSpan>(item.Name, item, timespan));
}
}
我調用GetField查找迄今爲止有一個字段爲「DefaultTimeToExpire」的項目,這部分很適合找到我需要的類型。 接下來我調用GetGenericArguments,它返回一個期望的Arguments類型的數組。 後來我打電話MakeGenericType 終於創建實例至極給我的錯誤消息
「因爲Type.ContainsGenericParameters是真的無法創建BusinessLogic.TestSubscriberXXX`1 [信息]的一個實例。」
這看起來正是我應該做的。 謝謝
您的'typeArguments'可能沒有足夠的類型來設置所有泛型的類型參數嗎? –
奇怪的錯誤,很難猜測你是如何以開放式結束的。快捷方式是使用Activator.CreateInstance(item.GetType())。 –