通用委托或通用委托问题

时间:2009-02-25 23:02:40

标签: c# generics delegates

如何编译以下代码?

    Action<MyClass<object, object>> func = x => Console.WriteLine(x.ToString());

    public void Apply<T1, T2>(MyClass<T1, T2> target)
    {
        func.Invoke(target);
    }

我知道它不起作用,因为MyClass&lt; T1,T2&gt;不是MyClass&lt; object,object&gt;,但我该怎么办?

我可以使该功能通用吗? 要么 我能投射目标吗?

无论如何,怎么样?

如果有帮助,func中的任何内容都不会执行T1或T2特定的任何操作。我知道这个假设可能会让它变得脆弱,但是单元测试应该能够解决任何问题。

编辑:我现在正在通过大量空接口来避免这个问题,而我宁愿这样做!

由于

2 个答案:

答案 0 :(得分:10)

好吧,一个选择是编写一个通用方法来返回正确的函数类型:

public void Apply<T1, T2>(MyClass<T1, T2> target)
{
    GetFunc<T1,T2>().Invoke(target);
}

private Action<MyClass<T1,T2>> GetFunc()
{
    return x => Console.WriteLine(x.ToString());
}

或者,如果您真的希望能够声明“我可以使用任何MyClass”操作,建议您创建非泛型类型MyClass,然后制作{{1}从中得出:

MyClass<T1,T2>

然后您可以改为使用public class MyClass { // Put common stuff in here } public class MyClass<T1, T2> : MyClass { // Put stuff using T1 and T2 here }

答案 1 :(得分:0)

在您提到的特定情况下,您只需更改操作&gt; to Action,因为您没有使用任何特定于'MyClass'的方法。

如果你想使用特定于'MyClass'的方法而不依赖于泛型类型,那么你应该定义一个包含这些方法的基类,从中派生MyClass,并使用基类型作为你的参数类型。委派。

如果你想使用特定于'MyClass'的方法,它们依赖于泛型类型,那么你应该在调用时创建一个具有正确类型的委托。