c# - Delegate.CreateDelegate - 方法参数不兼容

标签 c# reflection delegates

给定以下方法的MethodInfo

public class MyEffects
{
  public Task Test(object action, IDispatcher dispatcher)
  {
    return Task.CompletedTask;
  }
}

为什么以下 CreateDelegate 代码会抛出 System.ArgumentException:方法参数不兼容

Delegate.CreateDelegate(
    type: typeof(Func<object, IDispatcher, Task>),
    method: discoveredEffect.MethodInfo);

这也是如此

Delegate.CreateDelegate(
    type: typeof(Func<object, object, IDispatcher, Task>),
    method: discoveredEffect.MethodInfo);

最佳答案

由于您想要创建委托(delegate)给非静态方法,因此您必须使用 CreateDelegate(Type, Object, MethodInfo) 提供目标过载:

using System;
using System.Threading.Tasks;

public class Program
{
    public static void Main()
    {
        var method = typeof(MyEffects).GetMethod("Test");
        var obj = new MyEffects();
        var del = Delegate.CreateDelegate(typeof(Func<object, IDispatcher, Task>), obj, method);
        Console.WriteLine(del);
    }
}

public class MyEffects
{
  public Task Test(object action, IDispatcher dispatcher)
  {
    return Task.CompletedTask;
  }
}

public interface IDispatcher {} 

返回

System.Func`3[System.Object,IDispatcher,System.Threading.Tasks.Task]

关于c# - Delegate.CreateDelegate - 方法参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57938921/

相关文章:

c# - 在 lambda 中使用匿名类型映射或部分克隆任意数量的对象属性

c# - 在一个线程中调用 Add on SortedDictionary 并在另一个线程中获取 Item 是否安全?

javascript - 无法将参数传递给谷歌饼图MySql查询

.net - 将程序集加载到另一个 AppDomain 和类型检查

java - 如何使用 consumer 和 supplier 代替 java 8 中的 Reflection

swift - UIView 和 UIViewController 之间的委托(delegate)/协议(protocol)不起作用

C# 委托(delegate)未绑定(bind)到实例?

c# - 弱引用优势

C# - 将属性值从一个实例复制到另一个不同的类

iphone - 使用委托(delegate)在选项卡之间传递数据不起作用