【问题标题】:C# delegate with generic return Typ of List具有泛型返回列表类型的 C# 委托
【发布时间】:2017-06-16 07:17:05
【问题描述】:

我需要定义一个具有通用 List 返回类型的委托,这样做的最佳方式是什么?

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

那我想做这个

TestDelegate td = new TestDelegate(Method1);

或者这个

TestDelegate td = new TestDelegate(Method2);

Method1 和 Method2 的签名:

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

有没有办法做到这一点?

【问题讨论】:

    标签: c# generics delegates


    【解决方案1】:

    你可以定义抽象类:

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

    还有你的具体班级:

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

    那么委托就变成了:

    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);
    

    【讨论】:

    • 不会工作,因为List&lt;MyClass&gt; 不是List&lt;MyClass1&gt; 的超类型(试试吧,你会得到一个编译错误)。 List&lt;T&gt; 不是协变的:想象一下,如果您在 Method1 返回的值上尝试 returnValue.Add(new MyClass2()) 会发生什么。
    【解决方案2】:

    您可以将委托本身设为通用:

    delegate List<T> TestDelegate<T>(string arg1, string arg2);
    
    var td1 = new TestDelegate<MyClass1>(Method1);
    var td2 = new TestDelegate<MyClass2>(Method2);
    

    注意委托声明中的附加 &lt;T&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多