HINWEIS: Diese Frage zu einem technischen Aspekte ist, und NICHT über Design-Entscheidungen. Beantworten oder kommentieren über ein anderes Design tut nicht beantworten Sie diese Frage, da ich nur an der Art des technischen Aspekts dieser spezifischen Frage interessiert bin.GenericTypeDefinitionName von IEnumerable <object>
In C# 6.0
habe ich diese Methode, wo ich eine IEnumerable<T>
bin vorbei:
public void MyMethod(IEnumerable<object> list) { ... }
Lassen Sie uns sagen, dass der Anrufer ruft sie auf einem MyClass[]
Array.
Was ich will, ist der Klassenname der generischen Typdefinition, hatte ich diese Implementierung des Verfahrens:
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;
...
}
Jetzt in diesem Fall (im Inneren des Körpers des Verfahrens), diese korrekt gibt den Namen der Klasse (zB eine Zeichenkette "MyClass"
). Also habe ich versucht, diese in eine offene generische Erweiterungsmethode Refactoring wie so:
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();
}
Und dann GetGenericTypeDefinitionName()
rufen aus MyMethod()
etwa so:
public void MyMethod(IEnumerable<object> list)
{
...
var name = list.GetGenericTypeDefinitionName();
...
}
Welche auch funktioniert, aber dann merkte ich: 'Hallo! Warum nicht einfachreturn typeof(T).Name
? '
Welche stellte sich heraus, gibt es die Zeichenfolge "Object"
, während ich das gleiche Ergebnis erwartet (z. B. "MyClass"
) als die vorherige Implementierung.
Ist es überhaupt möglich, den erwarteten Typ zu erhalten? Es scheint, dass alle Informationen verloren gehen, wenn es um den offenen generischen Typ T
geht. Warum bekomme ich auch nicht den erwarteten Typ? Was sind die technischen Details dieses speziellen Verhaltens für C#
?
Aufruf Können Sie zeigen, wie genau man es nannte, so dass 'typeof (T) .Name'' "Objekt" zurück '? –
Verwenden Sie zufällig generische Varianz? Ein 'IEnumerable' kann einem 'IEnumerable
@ RenéVogt Ich habe die Frage bearbeitet, um zu zeigen, wie und wo die Erweiterungsmethode aufgerufen wird. – QuantumHive