Delegate.CreateDelegate(类型、对象、方法信息)抛出 ArgumentException "Cannot bind to the target method..."

Delegate.CreateDelegate(Type, object, MethodInfo) throws ArgumentException "Cannot bind to the target method..."

我使用序列化程序“NetStack.BitBuffer”。通过反射,我得到了所有读取方法,如 Int32 ReadInt、UInt32 ReadUInt 等。

为了加快从 methodinfo 的调用,我创建了委托,但在下次我想工作之后突然发生,甚至正在记录它以制作 vlog,但相同的代码显示异常。我调试了它,所有值都正确,但仍然无法正常工作。

public class BitBuffer // Recreated to test it
{
    public int ReadInt()
    {
        return 1;
    }
}

[Test]
public void DelegateCreateTest()
{
    BitBuffer bitBuffer = new BitBuffer();

    MethodInfo readIntMethod = bitBuffer.GetType().GetMethod("ReadInt");

    Assert.IsNotNull(readIntMethod, "Should not be null");

    var func = (Func<object>)Delegate.CreateDelegate(typeof(Func<object>), bitBuffer, readIntMethod);

    Assert.IsNotNull(func, "Should not be null");
}

上面的测试代码在异常开始显示之前有效。

System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'

如果将我的 self 更改为 Func<int> 那么它可以工作,但你可以猜到..所有其他 return 类型的方法都将无效。

如果我 google 它实际上什至不可能做到这一点,除了 post:我发现的相同代码在这里并且看起来它应该实际工作:

我真的很喜欢矩阵中的错误,无法解释为什么它突然不起作用。太糟糕了,我没有使用 git 来了解不同之处。

documentation 说:

the return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate.

虽然所有引用类型都被认为与 object 兼容,但像 int 这样的值类型需要装箱才能生成兼容类型。 CreateDelegate 不提供此服务。