使用约束解决缺失的部分泛型类型推断,IEntity其中TId:IEquatable;这允许调用者指定实体类型(T)的类型及其Id字段(TId)。然后,此接口的实现者将查找类型为T的实体,并使用id参数根据它们的id(在IEntity上定义)过滤它们。目前我称之为:intid=123;varmyApproval=PartsDC.FindById(id);理想情况下我想这样做:intid=123;varmyApproval=PartsDC.FindById(id);我读过这个问题的答案:C#中可能的部分泛型类型推断?我知道我无法获得我想要的语法,但它很接近。由于我的通用参数限制,我无法在我的案例中完全设置它。到目前为止,这是我所拥有的:publicclassFindIdWrapperwhereT:class{publicreadonlyIDataContextInvokeOn;publicFindIdWrapper(IDataContextinvokeOn){InvokeOn=invokeOn;}TById(TIdid)whereTId:IEquatable{returnInvokeOn.FindById(id);}}publicstaticclassDataContextExtensions{publicstaticFindIdWrapperFind(thisIDataContextdataContext)whereT:class,IEntity{returnnewFindIdWrapper(dataContext);我得到的编译错误是:类型“T”不能用作泛型类型或方法“PartsLegislation.Repository.IDataContext.FindById(TId)”中的类型参数“T”。没有从“T”到“PartsLegislation.Repository.IEntity”的隐式引用转换。我明白这意味着什么是因为我的包装类中的T仅限于引用类型,但FindById函数期望它是一个IEntity,但我不能,因为TId在方法中(否则我回来了).我该如何解决这个问题(或者我不能)?这通常是行不通的,因为TId你无法说服编译器TId约束。但是,您可以反转顺序,即varobj=ById(id).Find();不那么优雅,但它有效。执行:publicFinderById(TIdid)whereTId:IEquatable{returnnewFinder(this,id);}publicstructFinderwhereTId:IEquatable{privatereadonlyYourParentparent;私有只读TIdid;internalFinder(YourParentparent,TIdid){this.id=id;this.parent=parent;}publicTFind()whereT:class,IEntity{returnparent.FindById(id);}}警告:明确告诉它两个参数类型可能更容易。以上就是C#学习教程:使用约束解决缺少一些泛型类型推断的问题。分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表侵权,请点击有权联系管理员删除。如需转载请注明出处:
