2016-06-08 11 views
0

Ist es möglich, generische Typen zu generieren, sodass generisch typisierte Methoden mit Integritätsbedingungen aus Methoden ohne dieselben Integritätsbedingungen aufgerufen werden können. (Wie nach dem unten angegebenen Code)Aufrufen generisch typisierter Methoden mit Integritätsbedingungen aus Methoden ohne Integritätsbedingungen

private static void CheckThenCall<T>() 
{ 
    if(typeof(IHaveInterface).IsAssignableFrom(T)) 
    { 
     Call<T>(); 
    } 
} 
private static void Call<T>() where T : IHaveInterface 
{ 
    var typeOf = typeof(T); 
} 
+0

Gibt es einen Punkt, um Generika Methoden verwenden, wenn Sie gonna 'tun Typ von Tanzen 'in ihnen. Betrachten Sie Anruf in der Schnittstelle und machen IHaveInterface user6144226

+0

Ich bin nicht wirklich sicher, dass dies einen Sinn ergibt. Worauf kommt es an, generische Methoden zu verwenden, die keine Argumente enthalten und keine Leerstellen liefern? Der generische Typparameter ist in diesem Szenario völlig nutzlos. Vielleicht sollten Sie ein besseres Beispiel schreiben. – InBetween

Antwort

0

Vermutlich werden Sie Objekte des Typs T und nicht nur den Typ selbst verwenden wollen?

Wenn ja, dann ist es einfach mit den as operator, is operator und GetType. Alle diese arbeiten zur Laufzeit und verwenden den tatsächlichen Typ des Objekts.

Leider arbeiten is und as nicht auf Werttypen, so dass Sie T nur auf Klassen beschränken müssen.

private static void CheckThenCall<T>(T param) where T : class 
{ 
    if (param is IHaveInterface) 
    { 
     Call(param as IHaveInterface); 
    } 
} 

private static void Call<T>(T param) where T : IHaveInterface 
{ 
    Type typeOf = param.GetType(); 
} 
+0

Nur eine kurze Anmerkung: Es macht keinen Sinn, '' '' zu machen und dann 'as' zu tun. Doing 'is' macht die Besetzung und dann' as' tut es wieder. Tun Sie "wie" an erster Stelle und überprüfen Sie es dann auf Null. Auch - in anderen Situationen nicht "wie", ohne das Ergebnis für null zu überprüfen; Mach einfach eine harte Besetzung. Auf diese Weise erhalten Sie eine InvalidCastException anstelle einer NullReferenceException, wenn sie nicht funktioniert. –

+0

Nun, ich denke, der Punkt wäre, zu rufen einige Male, aber nicht andere :-) – buffjape

+0

@RichardIrons - Das ist keine gute Idee, den Code absichtlich eine Ausnahme zu werfen. Ausnahmen sollten außergewöhnlich sein. – Enigmativity

0

Allgemeine Einschränkungen werden bei der Kompilierung geprüft, so von der Laufzeit ist es zu spät ist! Kurz gesagt, nein

0

Sie können nicht, da es zur Kompilierzeit überprüft wird. Sie können Ihren Code jedoch geringfügig ändern, um ihn zu erstellen. Nehmen wir an, wir haben zwei Schnittstellen:

interface IFoo1 { } 
interface IFoo2 { } 

Und Sie haben zwei generische Methoden mit Einschränkungen:

static void Foo1<T>() where T : IFoo1 
{ 
    var t = typeof(T); 
} 

static void Foo2<T>() where T : IFoo2 
{ 
    var t = typeof(T); 
} 

Ich bin 100% sicher, dass Sie über typeof(T) in Foo1 und foo2 egal, denn neben den beiden dort ist nichts wichtig. Und Sie eine andere generische Methode haben, die keine Einschränkungen hat:

static void Foo<T>(T instance) 
{ 
    if (instance is IFoo1) 
    { 
     Foo1<T>(); //compile error! 
    } 
} 

Wenn Sie die Instanz übergeben, wird es einfacher sein:

static void Foo<T>(T instance) 
{ 
    if (instance is IFoo1) 
    { 
     Foo1(instance as IFoo1); 
    } 
} 

static void Foo1<T>(T instance) where T : IFoo1 
{ 
    var t = instance.GetType(); 
} 

static void Foo2<T>(T instance) where T : IFoo2 
{ 
    var t = instance.GetType(); 
} 
Verwandte Themen