如何实例化具有多个输入参数的泛型类型

本文关键字:输入 参数 泛型类型 实例化 | 更新日期: 2023-09-27 17:59:14

我有两个方法如下:

Method1(int a, int b)
{
    var type = Typ1(a, b);
}
Method2
{
    var type = Typ2(a, b);
}

我想写一个通用的方法来完成这项工作:

GenericMethod<T>(int a, int b)
{
    var type = new T(a, b);
}

但是T不接受任何输入参数。我怎样才能做到这一点?

我知道使用Activator.Instance(T, a, b)我可以做到这一点,但它的性能成本很高。

我也知道我可以使用T()调用泛型类型的默认构造函数,然后设置属性,但在我的情况下,我想传递2个强制性参数。

我不想引入一个没有参数的构造函数。

有什么方法可以用泛型做到这一点吗?

谢谢,

如何实例化具有多个输入参数的泛型类型

创建您的工厂类:

    public static class TypeFactory<T>
{
    private static Func<int, int, T> Func { get; set; }
    static TypeFactory()
    {
        TypeFactory<Type1>.Func = (a, b) => new Type1(a, b);
        TypeFactory<Type2>.Func = (a, b) => new Type2(a, b);
    }
    public static T Create(int a, int b)
    {
        return Func(a, b);
    }
}

然后这样使用:

        var type1 = TypeFactory<Type1>.Create(1, 2);
        var type2 = TypeFactory<Type2>.Create(1, 2);

否。

相反,您可以接受为您创建它们的委托:

GenericMethod<T>(int a, int b, Func<int, int, T> creator) {
    T t = creator(a, b);
}
GenericMethod(8, 9, (a, b) => new YourType(a, b));

您也可以将这些创建者存储在一个通用静态类中:

static class Creator<T> {
    public static Func<int, int, T> Func { get; set; }
}
GenericMethod<T>(int a, int b) {
    T t = Creator<T>.Func(a, b);
}

Creator<YourType>.Func = (a, b) => new YourType(a, b);

如果不想使用Activator,可以使用表达式树。为lambda声明提供的参数数量不正确

理论上,您需要使用泛型类型约束。但是,唯一可用的构造函数约束是支持无参数构造函数where T : new()

如果Typ1Typ2共享一个基类,该基类使用2个整数定义属性,或者两者都支持保证这些整数的setter的接口,则可以在每个类上定义一个无参数构造函数,并使用额外的约束来允许稍后访问属性。

public static class MyTypeFactory
{
    static MyTypeFactory()
    {
        MethodRunner<Type1>.Func = (a, b) => new Type1(a, b);
        MethodRunner<Type2>.Func = (a, b) => new Type2(a, b);
    }
    public static T Create<T>(int a, int b)
    {
        return MethodRunner<T>.Func(a, b);
    }
    static class MethodRunner<T>
    {
        public static Func<int, int, T> Func { get; set; }
    }
}

这看起来很有希望?!

静态ctor线程与静态字段初始化程序一样本质上是安全的(CLR)吗?