2017-06-16 1 views
2

Ich muss einen Delegaten mit einem generischen List-Rückgabetyp definieren, was ist der beste Weg, dies zu tun?C# -Delegate mit generischer Rückkehr Typ der Liste

delegate List<T> TestDelegate(string arg1, string arg2); 

Dann will ich diese

TestDelegate td = new TestDelegate(Method1); 

oder diese

TestDelegate td = new TestDelegate(Method2); 

Unterschrift des Method1 und Method2 tun:

List<MyClass1> Method1(string arg1, string arg2) 
List<MyClass2> Method2(string arg1, string arg2) 

Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

0

können Sie machen den Delegierten selbst generic:

delegate List<T> TestDelegate<T>(string arg1, string arg2); 

var td1 = new TestDelegate<MyClass1>(Method1); 
var td2 = new TestDelegate<MyClass2>(Method2); 

Beachten Sie die zusätzlichen <T> in der Delegatendeklaration.

1

Sie können abstrakte Klasse definieren:

public abstract class MyClass{ 
    public String GenericProperty{get;set;} 
} 

und Sie bestimmte Klasse:

public MyClass1 : MyClass { 
    public String SpecificProperty{get; set;} 
} 
public MyClass2 : MyClass { 
    public String OtherSpecificProperty{get; set;} 
} 

Dann wird der Delegat wird:

delegate List<MyClass> TestDelegate(string arg1, string arg2); 
List<MyClass> Method1(string arg1, string arg2) 
List<MyClass> Method2(string arg1, string arg2) 

List<MyClass> = new TestDelegate(Method1); 
List<MyClass> = new TestDelegate(Method2); 
+0

Wird nicht funktionieren, da 'Liste ' ist kein Supertyp von 'List ' (versuch es, du bekommst einen Kompilierfehler). 'List ' ist nicht kovariant: Stellen Sie sich vor, was passieren würde, wenn Sie 'returnValue.Add (new MyClass2())' auf den von 'Method1' zurückgegebenen Wert versuchen würden. – Heinzi

Verwandte Themen