C# 泛型委托或泛型强制转换问题

C# 泛型委托或泛型强制转换问题,c#,generics,delegates,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不是MyClass,但我能做什么 我

如何编译以下代码

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

    public void Apply<T1, T2>(MyClass<T1, T2> target)
    {
        func.Invoke(target);
    }
我知道它不起作用,因为MyClass不是MyClass,但我能做什么

我可以使函数通用吗? 或 我能投出目标吗

不管怎样,怎么做

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

编辑:我现在正在避免这个问题,因为我宁愿去掉大量的空接口


多亏了

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

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

然后您可以只使用一个操作来代替。

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

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

然后,您可以只使用一个操作。

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

如果要使用特定于“MyClass”且不依赖泛型类型的方法,则应定义包含这些方法的基类,从中派生MyClass,并将基类类型用作委托的参数类型


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

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

如果要使用特定于“MyClass”且不依赖泛型类型的方法,则应定义包含这些方法的基类,从中派生MyClass,并将基类类型用作委托的参数类型


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

doh,当然是泛型方法!我讨厌深夜编码!干杯哦,当然是通用方法!我讨厌深夜编码!干杯