当前位置: 首页 > 编程语言 > C#

带构造函数的泛型类型?

时间:2023-04-10 13:57:25 C#

C#:具有构造函数的泛型类型?我有以下C#测试代码:}}VisualStudio无法编译它,错误出现在使用“new”的行:“T”:创建变量类型实例时无法提供参数是否可以在C#中使用非参数构造函数?在C++模板中做这样的事情没有问题,所以我很好奇为什么我不能在C#中做同样的事情。也许需要一些额外的“哪里”或者语法不同?它可以通过反射来完成:publicvoidCreateItem(){intconstructorparm1=10;TooItem=Activator.CreateInstance(typeof(T),constructorparm1)asT;但是没有通用约束来确保T实现所需的构造函数,所以除非你小心地在实现接口的每个类型中声明构造函数,否则我不推荐它。就此而言,C#和VB.Net不支持将泛型限制为具有特定参数的构造函数的概念。它只支持具有空构造函数的约束。一种解决方法是让调用者传入工厂lambda以创建值。例如publicvoidCreateItem(Funcdel){ToItem=del(10);}调用站点CreateItem(x=>newSomeClass(x));没有这样的通用约束,所以不可能直接(这是CLR限制)。如果需要,必须提供工厂类(具有无参数构造函数)并将其作为第二个泛型类型参数传递。IMO,这里最好的方法是初始化方法,即interfaceISomeInterface{voidInit(inti);}classFoo:ISomeInterface{voidISomeInterface.Init(inti){/*...*/}}staticclassProgram{staticTCreate(inti)whereT:class,ISomeInterface,new(){Tt=newT();t.Init(i);返回吨;}staticvoidMain(){Foofoo=Create(123);但是,您可以使用表达式(但没有编译时支持):usingSystem;使用System.Linq.Expressions;classFoo{publicFoo(inti){/*...*/}}staticclassProgram{staticTCreate(inti){returnCtorCache.Create(i);}staticclassCtorCache{staticFuncctor;publicstaticTCreate(inti){if(ctor==null)ctor=CreateCtor();返回执行者(i);}staticFuncCreateCtor(){varparam=Expression.Parameter(typeof(int),"i");varci=typeof(T).GetConstructor(new[]{typeof(int)});if(ci==null)thrownewInvalidOperationException("Nosuchctor");varbody=Expression.New(ci,param);返回Expression.Lambda>(body,param).Compile();}}静态语音dMain(){Foofoo=创建(123);请注意,这会缓存并重用委托以提高性能我使用的一种模式是让受约束的类实现使用适当的签名Init方法定义的接口:以上是C#学习教程:C#:Genericstypewithconstructor?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注——interfaceIMyItem{voidInit(inta);}classMyItem:IMyItem{MyItem(){}voidInit(inta){}}classMyContainerwhereT:MyItem,IMyItem,new(){publicvoidCreateItem(){ToItem=newT();oItem.Init(10);}}本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢