C# 使用C“泛型”从方法创建泛型对象(而不是“新建”) 我习惯了C++模板,并意识到C语言中的事情有点不同。以下是我想要的: T CreateButton<T>() { T test = T.create(...some vars...); return test; } MakeLotsOfTs<Foo>( (Int32 param) => new Foo(param) ); T CreateButton(){ T test=T.create(…一些变量…); 回归试验; }
我想,也许使用一个派生约束和一个定义了“create”方法的基类就可以做到这一点,但它仍然无法编译 我得到了这个编译错误:C# 使用C“泛型”从方法创建泛型对象(而不是“新建”) 我习惯了C++模板,并意识到C语言中的事情有点不同。以下是我想要的: T CreateButton<T>() { T test = T.create(...some vars...); return test; } MakeLotsOfTs<Foo>( (Int32 param) => new Foo(param) ); T CreateButton(){ T test=T.create(…一些变量…); 回归试验; },c#,generics,C#,Generics,我想,也许使用一个派生约束和一个定义了“create”方法的基类就可以做到这一点,但它仍然无法编译 我得到了这个编译错误:**错误CS0119:表达式表示一个“类型参数”,其中需要一个“变量”、“值”或“类型”** 有没有一种方法可以完成我在C#中尝试做的事情?您必须定义并实现一个接口(或基类)。您还必须约束new()。然后可以对其使用通用约束 不能对泛型参数调用静态方法。例如:您不能在t上调用静态方法,您必须定义并实现接口(或基类)。您还必须约束new()。然后可以对其使用通用约束 不能对泛型
**错误CS0119:表达式表示一个“类型参数”,其中需要一个“变量”、“值”或“类型”**
有没有一种方法可以完成我在C#中尝试做的事情?您必须定义并实现一个接口(或基类)。您还必须约束
new()
。然后可以对其使用通用约束
不能对泛型参数调用静态方法。例如:您不能在
t
上调用静态方法,您必须定义并实现接口(或基类)。您还必须约束new()
。然后可以对其使用通用约束
不能对泛型参数调用静态方法。例如:您不能在
t
上调用静态方法这应该是您所追求的:
class MyFactory<T> where T : new()
{
public T CreateMyStuff()
{
return new T();
}
}
类MyFactory,其中T:new()
{
公共T CreateMyStuff()
{
返回新的T();
}
}
这应该是你想要的:
class MyFactory<T> where T : new()
{
public T CreateMyStuff()
{
return new T();
}
}
类MyFactory,其中T:new()
{
公共T CreateMyStuff()
{
返回新的T();
}
}
您的问题是调用T.Create时,就好像它是泛型T上的静态方法一样。这带来了两个问题——首先,您不能继承静态(必须这样做才能将T的类型限制为定义了“static Create”的基类,以便T.Create可以编译)。第二,即使可以继承静态,基类.Create()也必须“知道”才能返回T
你想要的是一个工厂。定义一个充当T工厂的类,然后就可以编写
T测试=工厂查看讨论您的问题是调用T.Create时,就好像它是泛型T上的静态方法一样。这会带来两个问题——首先,您不能继承静态(必须这样做才能将T的类型限制为定义了“static Create”的基类,以便T.Create可以编译)。第二,即使可以继承静态,基类.Create()也必须“知道”才能返回T 你想要的是一个工厂。定义一个充当T工厂的类,然后就可以编写 T测试=工厂
查看讨论问题在于具体的行
T.Create(…)
T是一个类型,而不是变量,因此除非Create()方法是该类型的静态方法,否则它不会编译,甚至不知道Create实际上是什么,因此您将无法编译函数调用。如果以某种方式约束T,使代码知道Create()函数存在,那么就可以这样做
示例
假设T始终是某个基类的成员或继承成员,则函数的声明如下:
T CreateButton<T>() where T : BusinessObjectBase
{
T test = (T)BusinessObjectBase.create(...some vars...);
return test;
}
T CreateButton(),其中T:BusinessObjectBase
{
T test=(T)BusinessObjectBase.create(…一些变量…);
回归试验;
}
在本例中,静态函数Create()在BusinessObjectBase中声明,作为T传入的类型被约束为该类或从该类扩展而来,从而保证T能够调用Create()函数的代码
当然,正如其他人提到的,使用new()约束要容易得多。这允许您简单地返回新的T();复杂度要低得多,但是会丢失create函数中的所有参数。问题在于特定行
T.create(…)
T是一个类型,而不是变量,因此除非Create()方法是该类型的静态方法,否则它不会编译,甚至不知道Create实际上是什么,因此您将无法编译函数调用。如果以某种方式约束T,使代码知道Create()函数存在,那么就可以这样做
示例
假设T始终是某个基类的成员或继承成员,则函数的声明如下:
T CreateButton<T>() where T : BusinessObjectBase
{
T test = (T)BusinessObjectBase.create(...some vars...);
return test;
}
T CreateButton(),其中T:BusinessObjectBase
{
T test=(T)BusinessObjectBase.create(…一些变量…);
回归试验;
}
在本例中,静态函数Create()在BusinessObjectBase中声明,作为T传入的类型被约束为该类或从该类扩展而来,从而保证T能够调用Create()函数的代码
当然,正如其他人提到的,使用new()约束要容易得多。这允许您简单地返回新的T();远没有那么复杂,但是您会丢失那些来自create函数的参数。除了满足
new
约束的类型之外,没有办法创建泛型类型的新对象,只提供类型。相反,您最好的选择可能是使用需要使用c的方法