当用作类型参数时,是否可以将参数传递给类构造函数?

时间:2019-02-04 13:15:15

标签: c# types parameters constructor arguments

我试图使我的代码尽可能地可重用,并且在尝试将构造函数参数传递给用作类型参数的类时遇到问题。

我目前所拥有的是:

    public sealed class SubmitForm : DerivedClass
    {            
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<SubmitForm>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

之所以起作用,是因为没有用于SubmitForm的显式构造函数和参数。但是,我想扩展功能,并且需要一个显式的构造函数,并期望有一个参数。

添加构造函数后,我希望使用类型参数“ SubmitForm”调用“ GetObject”,其中包括其显式构造函数的参数。

这显然不可能以任何直接的方式实现,但是我不想相信没有办法使它起作用。

下面显示了我要实现的目标,即在实例化该类时将其用作类型参数,以访问我创建的构造函数:

    public sealed class SubmitForm : DerivedClass
    {
        public SubmitForm(EnumType typeVar)
        {
            _derivedVar = typeVar;
        }
    }

    public void TestMethod_Simulated()
    {
        var foo = GetObject<new SubmitForm(EnumType.FormA)>();
        SubmitData(foo);
    }

    private void SubmitData(SubmitForm form)
    {
        // Do work 
    }

    public T GetObject<T>()
        where T : class
    {
        // Work
    }

我希望这是有道理的。我似乎找不到一种方法来首先实例化该类,然后将其用作类型参数。

1 个答案:

答案 0 :(得分:0)

  

我希望这是有道理的。我似乎找不到办法   实例化该类,然后将其用作类型参数

好吧,不可能将类的 instance 作为通用类型参数传递。 类型参数只是对象类型的占位符。编译器使用它来推断类型并将T替换为实际类型。它与实际参数无关。

如果要在函数中使用SubmitForm类的特定实例,可以先创建一个实例:

var submitForm = new SubmitForm(EnumType.FormA);

然后更改您的函数以接受T类型的参数:

public T GetObject<T>(T instance)
    where T : class
{
   // .. do something with instance
}

现在您可以调用新的重载了:

var someResult = GetObject(submitForm);

但是,从代码示例中并不清楚为什么根本需要泛型类型参数。似乎您也可以将GetObject函数的签名从T GetObject<T>()更改为SubmitForm GetObject(SubmitForm form)

当我们有一个通用函数需要为不同类型执行或多或少相同的逻辑并且我们不想重复相同的代码时,我们通常使用类型参数。