注意:这个问题是关于技术方面,而不是约设计决策。回答或评论不同的设计不是回答这个问题,因为我只对这个特定问题的技术方面的性质感兴趣。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