ПРИМЕЧАНИЯ: Этого вопрос о техническом аспекте, и НЕ о проектных решениях. Ответ или комментарий о другом дизайне НЕ Ответьте на этот вопрос, так как меня интересует только природа технического аспекта этого конкретного вопроса.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