注意:這個問題是關於技術方面,而不是約設計決策。回答或評論不同的設計不是回答這個問題,因爲我只對這個特定問題的技術方面的性質感興趣。GenericTypeDefinitionName自IEnumerable <object>
在C# 6.0
我有這樣的方法,在那裏我傳遞一個IEnumerable<T>
:
public void MyMethod(IEnumerable<object> list) { ... }
假設主叫用戶呼叫它的一個MyClass[]
陣列上。
我要的是泛型類型定義的類名,我有這樣的方法實現:
public void MyMethod(IEnumerable<object> list)
{
...
var name =
from abstraction in list.GetType().GetInterfaces()
where abstraction.IsGenericType
&& abstraction.GetGenericTypeDefinition() == typeof(IEnumerable<>)
from genericArgumentType in abstraction.GetGenericArguments()
select genericArgumentType.Name;
...
}
現在,在這種情況下,(該方法的主體內),這正確返回的名稱類(例如字符串"MyClass"
)。所以我試圖重構到這個開放的通用擴展方法,像這樣:
public static string GetGenericTypeDefinitionName<T>(this IEnumerable<T> list)
{
var name =
from abstraction in list.GetType().GetInterfaces()
where abstraction.IsGenericType
&& abstraction.GetGenericTypeDefinition() == typeof(IEnumerable<>)
from genericArgumentType in abstraction.GetGenericArguments()
select genericArgumentType.Name;
return name.Single();
}
然後調用GetGenericTypeDefinitionName()
從MyMethod()
內,像這樣:
public void MyMethod(IEnumerable<object> list)
{
...
var name = list.GetGenericTypeDefinitionName();
...
}
也可以工作,但後來我意識到:「嘿!爲什麼不只是return typeof(T).Name
?'
事實證明,它返回字符串"Object"
,而我期望與以前的實施相同的結果(例如"MyClass"
)。
它甚至有可能得到預期的類型?似乎在處理開放式泛型T
時,所有信息都會丟失。 此外,爲什麼我沒有得到預期的類型? C#
的這種特殊行爲的技術細節是什麼?
你能告訴你究竟是如何把它稱爲使'的typeof(T).Name'返回' 「對象」'? –
你是否在使用通用方差? 'IEnumerable'可以被分配給'IEnumerable
@RenéVogt我編輯了這個問題來展示如何和在哪裏調用擴展方法。 – QuantumHive