具有开放泛型的方法转换为委托

问题描述

我需要获取带有开放泛型类型参数作为委托的方法的委托引用。 这可能吗?

将非泛型方法转换为委托很简单,但是在涉及开放泛型时,CLR似乎没有意识到开放泛型的委托类型的方法签名与{{1}兼容}具有相同泛型类型参数的方法

在此代码中,MethodInfo失败,但TestNonGeneric通过。

TestGeneric

很明显,方法信息在通用版本中缺少通用类型参数。也许CLR根本不允许在没有指定所有类型参数的情况下创建委托。如果是这种情况,我想知道。看到一些与此有关的文档会特别好,但是我在official documentation中找不到任何内容

我得到的错误是:

无法绑定到目标方法,因为其签名与委托类型的签名不兼容。'

还要注意,它会编译:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Threading.Tasks;

namespace DelegatesWithOpenGenerics
{

    [TestClass]
    public partial class Tests
    {      
        public delegate object SaveDelegateNonGeneric(object item);
        public delegate T SaveDelegateGeneric<T>(T item) where T : class;

        [TestMethod]
        public async Task TestNonGeneric()
        {
            var methodInfo = GetType().getmethod(nameof(SaveMethodNonGeneric));
            var @delegate = Delegate.CreateDelegate(typeof(SaveDelegateNonGeneric),this,methodInfo);
        }

        [TestMethod]
        public async Task TestGeneric()
        {
            var methodInfo = GetType().getmethod(nameof(SaveMethodGeneric));
            var @delegate = Delegate.CreateDelegate(typeof(SaveDelegateGeneric<>),methodInfo);
        }

        public object SaveMethodNonGeneric(object item)
        {
            return default;
        }

        public T SaveMethodGeneric<T>(T item) where T : class
        {
            return default;
        }    
    }
}

但这不是:

var @delegate = (SaveDelegateNonGeneric)SaveMethodNonGeneric;

编译错误为:

意外使用了未绑定的通用名称

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)