我试图使我的代码尽可能可重用,但在尝试将构造函数参数传递给用作类型参数的类时遇到了问题。
我目前拥有的是:
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
}
我希望这是有道理的。我似乎找不到首先实例化类然后将其用作类型参数的方法。
我希望这是有道理的。我似乎找不到首先实例化类然后将其用作类型参数的方法
好吧,不可能将类的实例作为泛型类型参数传递。类型参数只是对象类型的占位符。编译器使用它来推断类型并替换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)
当我们有一个泛型函数需要对不同类型执行或多或少相同的逻辑并且我们不想重复相同的代码时,我们通常会使用类型参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句