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 {}
我有一个接受参数的通用委托,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 {}