编程语言
首页 > 编程语言> > C#反射,将MakeGenericMethod与具有’new()’类型约束的方法一起使用

C#反射,将MakeGenericMethod与具有’new()’类型约束的方法一起使用

作者:互联网

我试图按如下方式使用MethodInfo MakeGenericMethod:

        foreach (var type in types)
        {
            object output = null;
            var method = typeof (ContentTypeResolver).GetMethod("TryConstruct");
            var genmethod = method.MakeGenericMethod(type);
            var arr = new object[] { from, output };
            if ((bool)genmethod.Invoke(null, arr))
                return (IThingy)arr[1];
        }

针对以下通用方法:

    public static bool TryConstruct<T>(string from, out IThingy result) where T : IThingy, new()
    {
        var thing = new T();
        return thingTryConstructFrom(from, out result);
    }

我遇到的问题是,我传递的类型不是’new()’,因此我在MakeGenericMethod行上遇到了争论异常

有办法解决吗?
谢谢

解决方法:

不能.您只能使用类型参数满足IThingy和新约束的封闭构造TryConstruct方法.否则,您将打败TryConstruct合同:调用TryConstruct并碰到新的T()行会发生什么?不会有T()构造函数,因此您将违反类型安全性.

在将类型传递给MakeGenericMethod之前,您需要检查该类型是否具有公共默认构造函数.如果需要使用非默认构造函数实例化类型,则需要创建一个新方法或TryConstruct重载,也许是使用Activator.CreateInstance而不是new T()的方法.

标签:generic-method,reflection,generics,c
来源: https://codeday.me/bug/20191024/1918657.html