gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:11:26 32 4
gpt4 key购买 nike

我正在尝试按如下方式使用 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);
}

我遇到的问题是我在 MakeGenericMethod 行上收到一个争论异常,因为我传递的类型不是“new()”

有办法解决这个问题吗?谢谢

最佳答案

没有。您只能使用满足 IThingynew 约束的类型参数创建封闭构造的 TryConstruct 方法。否则你将击败 TryConstruct 契约:当你调用 TryConstruct 并且它命中 new T() 行时会发生什么?不会有 T() 构造函数,因此您违反了类型安全。

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

关于C# 反射,将 MakeGenericMethod 与具有 'new()' 类型约束的方法一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375422/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com