繁体   English   中英

通用委托或通用转换问题

[英]Generic delegate or generic cast problem

如何编译以下代码?

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

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

我知道它不起作用,因为 MyClass<T1, T2> 不是 MyClass<object, object>,但我能做什么?

我可以使 function 通用吗? 或者我可以施放目标吗?

无论哪种方式,如何?

如果它有帮助,那么 func 中的任何内容都不会做任何特定于 T1 或 T2 的事情。 我知道这种假设可能会使它变得脆弱,但单元测试应该能发现任何问题。

编辑:我目前正在避免使用大量空接口的问题,我宁愿取消这些接口!

谢谢

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

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 ,并让MyClass<T1,T2>从中派生:

public class MyClass
{
    // Put common stuff in here
}

public class MyClass<T1, T2> : MyClass
{
    // Put stuff using T1 and T2 here
}

然后你可以只使用一个Action<MyClass>代替。

在您提到的特定情况下,您只需将 Action> 更改为 Action,因为您没有使用任何特定于“MyClass”的方法。

如果您想使用不依赖于泛型类型的特定于“MyClass”的方法,那么您应该定义一个包含这些方法的基本 class,从中派生 MyClass,并将基本类型用作委托的参数类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM