3

我正在尝试使用 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()”

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

4

1 回答 1

5

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

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

于 2010-03-03T22:18:02.580 回答