微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决具有开放泛型的方法转换为委托

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

将非泛型方法转换为委托很简单,但是在涉及开放泛型时,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 举报,一经查实,本站将立刻删除。