C# 反射,使用 MakeGenericMethod 和具有“new()”的方法;类型约束

发布于 2024-08-23 12:34:52 字数 780 浏览 13 评论 0原文

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

是否有解决方法这?? 谢谢

I am trying to use the MethodInfo MakeGenericMethod as follows:

        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];
        }

Against the following generic method:

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

The problem I having is that I get an arguement exception on the MakeGenericMethod line as the type I am passing is not 'new()'

Is there a way round this??
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我很OK 2024-08-30 12:34:52

不可以。您只能使用满足 ITingynew 约束的类型参数来创建封闭构造的 TryConstruct 方法。否则你就会破坏 TryConstruct 合约:当你调用 TryConstruct 并且它到达 new T() 行时会发生什么?不会有 T() 构造函数,因此违反了类型安全。

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

No. You can only make closed constructed TryConstruct methods with type parameters that meet the IThingy and new constraints. Otherwise you'd be defeating the TryConstruct contract: what would happen when you called TryConstruct and it hit the new T() line? There wouldn't be a T() constructor, so you'd have violated type safety.

You need to check that type has a public default constructor before passing it to MakeGenericMethod. If you need to instantiate types with a nondefault constructor, you need to create a new method or a TryConstruct overload, perhaps one which uses Activator.CreateInstance instead of new T().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文