C# - 将通用委托转换为非通用委托

C# - Casting a Generic Delegate to a Non Generic Delegate

我有一个接受参数的通用委托,Args<T>。我还有一个接受 Args.

的普通代表
delegate Task ExampleDelegate<T>(Args<T> args)

delegate Task ExampleDelegate(Args args)

Args<T>Args

延伸
public class Args {

}

public class Args<T> : Args {

}

我目前正在扩展我的非通用 interfaces/classes,它使用 ExampleDelegate 创建新的通用 interfaces/classes 使用 ExampleDelegate<T>

因为它们都扩展了非通用版本,所以扩展它们到目前为止一直很轻松,直到我不得不重写一个接受 ExampleDelegate.

的方法

我无法将 ExampleDelegate<T> 转换为 ExampleDelegate,因为签名不匹配。

我能够做到这一点的方法之一是,

ExampleDelegate<SomeClass> genericDelegate= //some method

//First case
ExampleDelegate nonGenericDelegate = args => genericDelegate(args as Args<SomeClass>);

//Second case
genericDelegate = argsT => nonGenericDelegate(argsT);

有更好的方法吗?

更新: 是否可以在不创建像上面那样的匿名方法的情况下做到这一点?

有更好的方法吗?

可能是,但我们不知道您要做什么,所以我们无法帮助您

我不明白为什么我也需要在第二种情况下显式转换?

你不...? 这是一些编译得很好的代码:

class TestClass
{
    void DoStuff()
    {
        ExampleDelegate nonGeneric = a => { };
        ExampleDelegate<int> generic = b => nonGeneric(b);
    }
}

delegate void ExampleDelegate(Args args);

delegate void ExampleDelegate<T>(Args<T> args);

class Args<T> : Args {}

class Args {}