C#lambda查询使用泛型我有三个类,它们都有属性date。我想编写一个通用类来返回某个日期的所有记录。现在的问题是:如何使用泛型类型T编写lambda表达式?代码很简单(我不会编译,因为“r.Date”不起作用,但这是我想要实现的)publicIEnumerableGetRecordList(DateTimedate){varquery=_genericRepository.FindBy(r=>r.Date=date);}感谢您的帮助!此致,Léona另一种选择是动态构建表达式。如果您不想或不能将IDate接口添加到模型对象,并且如果FindBy需要Expression>(例如,它转换为IQueryable.Where(...)IQueryable.Where(...)insideEntityFramework或类似的。就像@JonB的回答一样,这没有编译时安全性来确保T具有Date属性或字段。它只是在运行时失败。publicIEnumerableGetRecordList(DateTimedate){varparameterExpression=Expression.Parameter(typeof(T),"object");varpropertyOrFieldExpression=Expression.PropertyOrField(parameterExpression,"Date");varequalityExpression=Expression.Equal(propertyOrFieldExpression,Expression.Constant(date,typeof(DateTime)));varlambdaExpression=Expression.Lambda>(equalityExpression,parameterExpression);varquery=_genericRepository.FindBy(lambdaExpression);返回查询;}用IDate编写一个接口,所有实体都必须实现IDate并像这样编写GenericService:publicclassGenericService:IGenericServicewhereT:class,IDate{readonlyIGenericRepository_genericRepository;publicIEnumerableGetRecordList(DateTimedate){varquery=_genericRepository.FindBy(r=>r.Date=date);}publicinterfaceIDate{DateTimeDate{set;得到;}}公共类实体:IDate{DateTimeDate{set;得到;另一种解决方案,如果你不能实现一个接口并且不想使用反射,你可以将howPassdatetoGenericService:byproperty:publicclassGenericService:IGenericServicewhereT:class{publicFuncDateGetter{get;放;}只读IGenericRepository_genericRepository;publicIEnumerableGetRecordList(DateTimedate){varquery=_genericRepository.FindBy(r=>DateGetter(r)==date);}通过构造函数:publicclassGenericService:IGenericServicewhereT:class{Func_dateGetter;publicGenericService(...,FuncdateGetter){_dateGetter=dateGetter...}readonlyIGenericRepository_genericRepository;publicIEnumerableGetRecordList(DateTimedate){varquery=_genericRepository.FindBy(r=>_dateGetter(r)==date);}}通过方法本身:publicclassGenericService:IGenericServicewhereT:class{readonlyIGenericRepository_genericRepository;publicIEnumerableGetRecordList(DateTimedate,FuncdateGetter){varquery=_genericRepository.FindBy(r=>dateGetter(r)==date);按类型:AdamRalph的解决方案激发了我的灵感(我猜不是最好的,但它仍然有效)publicclassGenericService:IGenericServicewhereT:class{publicDictionary>_dateGetter=newDictionary>(){{typeof(TypeWithDate),x=>((TypeWithDate)x).Date},{typeof(TypeWithDate2),x=>((TypeWithDate2)x).Date}};只读IGenericRepository_genericRepository;publicIEnumerableGetRecordList(DateTimedate){varquery=_genericRepository.FindBy(r=>_dateGetter[typeof(T)](r)=date);假设对象列表不是很大,为3个类编写一些通用的东西可能会过度设计Kiss。objects.Where(obj=>(objasFoo)?.DateTime==date||(objasBar)?.DateTime==date||(objasBaz)?.DateTime==date)我不确定关于您的FindBy方法的结构方式或它返回的内容,但您可以像这样使用动态关键字:varquery=_genericRepository.FindBy(r=>((dynamic)r).Date==date);如果FindBy方法返回一个IEnumerable,那么您可能必须将.Cast()添加到return语句,否则您可能会得到一个IEnumerable。这绝不是类型安全的,如果T没有Date属性,您可能会遇到运行时错误。但这是一个值得考虑的选择。以上就是C#学习教程:C#lambda查询使用泛型类型的全部内容分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
