c# - 如何将 Action 转换为具有相同签名的已定义委托(delegate)?

标签 c# generics delegates

class Test
{
    public delegate void FruitDelegate(Fruit f);

    public void Notify<T>(Action<T> del) where T : Fruit
    {
        FruitDelegate f = del; // Cannot implicitly convert type 'Action<T>' to 'FruitDelegate
    }
}

Fruit 是一个空类。这两位委托(delegate)都有相同的签名。

我似乎无法使这些工作正常进行。如果我解释一下我正在尝试做什么(提供一些背景信息),也许会有所帮助。

我想创建一个具有通用静态方法的类,该方法提供类型和方法回调(如上例)。

我遇到的问题是委托(delegate)包含一个参数,我不想在方法回调中强制转换它。例如,我想要这个:

public void SomeMethod()
{
    Test.Notify<Apple>(AppleHandler);
}

private void AppleHandler(Apple apple)
{

}

取而代之的是:

public void SomeMethod()
{
    Test.Notify<Apple>(AppleHandler);
}

private void AppleHandler(Fruit fruit)
{
    Apple apple = (Apple)fruit;
}

这种事情可能吗?

最佳答案

这是你想要的吗?

static void Main(string[] args)
{

    Program p = new Program();
    p.SomeMethod();
}

public class Fruit
{ }

public class Apple : Fruit { }

public delegate void FruitDelegate<in T>(T f) where T : Fruit;

class Test
{
    public static void Notify<T>(FruitDelegate<T> del)
        where T : Fruit, new()
    {
        T t = new T();
        del.DynamicInvoke(t);
    }
}

private void AppleHandler(Apple apple)
{
    Console.WriteLine(apple.GetType().FullName);
}

public void SomeMethod()
{
    FruitDelegate<Apple> del = new FruitDelegate<Apple>(AppleHandler);
    Test.Notify<Apple>(del);
}

关于c# - 如何将 Action 转换为具有相同签名的已定义委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830441/

相关文章:

c# - 在 IList<T> 中排序项目

c# - 隐式强制转换对委托(delegate)类型推断的意外影响

c# - 如何在 nhibernate 中急切地加载子集合

java - 参数化类型和泛型类

c# - 如何在 C# 中实现带有参数和返回值泛型的方法、接口(interface)

c# - 在 C# 中将 EventHandler 类型 var 等同于委托(delegate)意味着什么?

javascript - 如何从 ASP.NET 委托(delegate)执行 Response.Redirect

c# - 不显眼的日期时间? MVC4 中的验证

c# - 使用 PrintDocument 打印多页

c# - 如何制作 XML 节点的副本及其所有子节点和值但名称不同 C# .NET