gpt4 book ai didi

c# - 通用接口(interface)方法的开放委托(delegate)

转载 作者:IT王子 更新时间:2023-10-29 04:28:05 28 4
gpt4 key购买 nike

我正在尝试创建一个 open instance delegate对于通用接口(interface)方法,但我一直收到 NotSupportedException。这是不会运行的简化代码:

interface IFoo
{
void Bar<T>(T j);
}
class Foo : IFoo
{
public void Bar<T>(T j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar").MakeGenericMethod(typeof(int));
var x = Delegate.CreateDelegate(typeof(Action<IFoo, int>), null, bar);
}

最后一行抛出 NotSupportedException,“不支持指定的方法”。相比之下,非通用开放实例委托(delegate)运行良好:

interface IFoo
{
void Bar(int j);
}
class Foo : IFoo
{
public void Bar(int j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar");
var x = Delegate.CreateDelegate(typeof(Action<IFoo, int>), null, bar);
}

封闭的通用委托(delegate)也可以工作:

interface IFoo
{
void Bar<T>(T j);
}
class Foo : IFoo
{
public void Bar<T>(T j)
{
}
}
static void Main(string[] args)
{
var bar = typeof(IFoo).GetMethod("Bar").MakeGenericMethod(typeof(int));
var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
}

因此,封闭式通用委托(delegate)和开放式实例委托(delegate)的配方是分开工作的,但结合起来就不行了。它开始看起来像是运行时错误或故意遗漏。有人对此有任何见解吗?

最佳答案

这是对主题和发现此问题的特定问题的回顾(因为 OP 似乎已经在 Microsoft Connect 上得到了他的答案)。


回答

为通用接口(interface)方法创建一个开放实例通用委托(delegate)是不可能的(正如 Microsoft 确认的 here )。目前,可以实现以下任意组合的开放实例/封闭静态、泛型/非泛型、接口(interface)/类方法(答案末尾提供了代码示例):

  • 为非泛型接口(interface)方法打开实例非泛型委托(delegate)
  • 关闭通用接口(interface)方法的静态通用委托(delegate)
  • 为非泛型接口(interface)方法关闭静态非泛型委托(delegate)
  • 为泛型类方法打开实例泛型委托(delegate)
  • 为非泛型类方法打开实例非泛型委托(delegate)
  • 关闭通用类方法的静态通用委托(delegate)
  • 关闭非泛型类方法的静态非泛型委托(delegate)

通常,通用接口(interface)方法的开放实例通用委托(delegate)的最佳替代品是通用方法的开放实例通用委托(delegate)。


代码示例

  • 为非泛型接口(interface)方法打开实例非泛型委托(delegate)

    interface IFoo
    {
    void Bar(int j);
    }

    class Foo : IFoo
    {
    public void Bar(int j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(IFoo).GetMethod("Bar");
    var x = Delegate.CreateDelegate(typeof(Action<IFoo, int>), null, bar);
    }
  • 关闭通用接口(interface)方法的静态通用委托(delegate)

      interface IFoo
    {
    void Bar<T>(T j);
    }

    class Foo : IFoo
    {
    public void Bar<T>(T j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(IFoo).GetMethod("Bar").MakeGenericMethod(typeof(int));
    var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
    }
  • 为非泛型接口(interface)方法关闭静态非泛型委托(delegate)

      interface IFoo
    {
    void Bar(int j);
    }

    class Foo : IFoo
    {
    public void Bar(int j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(IFoo).GetMethod("Bar");
    var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
    }
  • 为泛型类方法打开实例泛型委托(delegate)

    class Foo
    {
    public void Bar<T>(T j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(Foo).GetMethod("Bar").MakeGenericMethod(typeof(int));
    var x = Delegate.CreateDelegate(typeof(Action<Foo, int>), null, bar);
    }
  • 为非泛型类方法打开实例非泛型委托(delegate)

    class Foo
    {
    public void Bar(int j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(Foo).GetMethod("Bar");
    var x = Delegate.CreateDelegate(typeof(Action<Foo, int>), null, bar);
    }
  • 关闭泛型类方法的静态泛型委托(delegate)

    class Foo
    {
    public void Bar<T>(T j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(Foo).GetMethod("Bar").MakeGenericMethod(typeof(int));
    var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
    }
  • 关闭非泛型类方法的静态非泛型委托(delegate)

    class Foo
    {
    public void Bar(int j)
    {
    }
    }

    static void Main(string[] args)
    {
    var bar = typeof(Foo).GetMethod("Bar");
    var x = Delegate.CreateDelegate(typeof(Action<int>), new Foo(), bar);
    }

关于c# - 通用接口(interface)方法的开放委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7136615/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com