有没有办法为类型参数一起使用时的参数传递给类的构造函数?

问题描述 投票:0回答:1

我试图让我的代码作为可重复使用成为可能,并试图通过一个constuctor参数作为类型参数的类时,遇到了一个问题。

我现在有这样的:

    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没有明确的构造和参数。不过,我想扩展功能并需要一个明确的构造期待的理由。

添加构造后,我期待称之为“GetObject的”与类型参数“SubmitForm”包括其明确的构造函数的参数。

这显然是不可能以任何直接的方式,但我不想相信没有得到这个工作的方式。

下面显示了我想要实现的,这是使用类作为一个类型参数,而为了访问我所创建的构造函数实例吧:

    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
    }

我希望这是有道理的。我似乎无法找到一种方法,首先实例类,然后把它作为一个类型参数。

c# types parameters constructor arguments
1个回答
0
投票

我希望这是有道理的。我似乎无法找到一种方法,首先实例类,然后把它作为一个类型参数

那么,它是不可能通过一类作为泛型类型参数的实例。 A型参数仅做类型的对象的占位符。编译器使用它来推断类型和一个真正的替代型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)

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

© www.soinside.com 2019 - 2024. All rights reserved.