2 Stimmen

Wie kann ich prüfen, ob ein Objekt von einem generischen Typ ist?

Um der Argumentation willen habe ich eine object . Ich kann die Signatur meiner Funktion nicht ändern, weil ich die Klasse einer anderen Person erweitere.

Um ein konkretes Beispiel zu nennen, habe ich folgendes:

class Foo<T> : SomeBaseClass
{
    public override MyFunction(object value)
    {
        // TODO: Figure out if value is an instance of Foo, though I don't care
        // what type was associated with it.
    }
}

Gibt es eine Möglichkeit, sicherzustellen, dass value ist ein Beispiel für eine Foo Typ?

6voto

Jon Skeet Punkte 1325502

Nun, wenn Sie überprüfen wollen, ob es sich um genau a Foo<something> Es ist ziemlich einfach:

Type type = value.GetType();
if (!type.IsGenericType)
{
    throw new ArgumentException("Not a generic type");
}
if (type.GetGenericTypeDefinition() != typeof(Foo<>))
{
    throw new ArgumentException("Not the right generic type");
}

Wenn Sie entscheiden müssen, ob es sich um ein Typ, der von Foo<T> Es ist etwas schwieriger, weil man nicht unbedingt weiß, wo es generisch sein wird. Zum Beispiel könnte es sein:

class Bar : Foo<string>

ou

class Baz<T> : Foo<T>

Eine Alternative zur Vereinfachung könnte die Einführung einer weiteren nicht-generischen Klasse sein:

abstract class Foo : SomeBaseClass

class Foo<T> : Foo

Dann können Sie es einfach tun:

if (value is Foo)

Das würde natürlich auch andere Typen zulassen, die sich von Foo . In vielen Fällen wäre das kein Problem, aber es hängt von Ihrer genauen Situation ab. Sie könnten auch alle Mitglieder, die sich nicht auf T en Foo zugreifen, so dass Sie in Fällen wie diesem, wo Sie sich nicht um T .

2voto

Anton Gogolev Punkte 109749

Sie könnten versuchen, die GetGenericTypeDefinition en value.GetType() . Damit erhalten Sie grundsätzlich entweder Foo<> oder eine Ausnahme auslösen. Um Letzteres zu vermeiden, prüfen Sie IsGenericType Flagge.

0voto

Ian Punkte 32230

Ich glaube nicht, dass Sie es tun können, wenn Sie von einer Basisklasse überschreiben sind.

Sie könnten jedoch etwas in dieser Richtung tun. Der große Nachteil ist, dass Sie die Kompilierzeit Typprüfung verlieren und es bis zu der Laufzeit verlassen.

class Foo<T> : SomeBaseClass
{
    public override MyFunction(object value)
    {
       if(value.GetType() != typeof(T))
       {
          // wrong type throw exception or similar
       }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X