Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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# 使用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()。然后可以对其使用通用约束 不能对泛型

我想,也许使用一个派生约束和一个定义了“create”方法的基类就可以做到这一点,但它仍然无法编译

我得到了这个编译错误:
**错误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做正确的事情的类型。但这正是控制反转和依赖注入可以帮助您的地方。为您需要的每种类型的T定义一个带有“插件”的工厂。使用IoC将插件注入工厂


查看讨论

您的问题是调用T.Create时,就好像它是泛型T上的静态方法一样。这会带来两个问题——首先,您不能继承静态(必须这样做才能将T的类型限制为定义了“static Create”的基类,以便T.Create可以编译)。第二,即使可以继承静态,基类.Create()也必须“知道”才能返回T

你想要的是一个工厂。定义一个充当T工厂的类,然后就可以编写

T测试=工厂。创建(…一些变量…)

这感觉就像是一个巨大的开关语句——基于真正的T做正确的事情的类型。但这正是控制反转和依赖注入可以帮助您的地方。为您需要的每种类型的T定义一个带有“插件”的工厂。使用IoC将插件注入工厂


查看讨论

问题在于具体的行
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的方法