c# 泛型属性筛选器

c# Generics property filter

提问人:Gerald St 提问时间:3/24/2021 最后编辑:John SaundersGerald St 更新时间:3/24/2021 访问量:147

问:

我是泛型的新手,并试图找出一个问题。

我创建了一个抽象类,其中包含用于数据库 CRUD 方法的方法,用于特定类型的存储库类,例如博客、帖子等。我希望在搜索方法中根据接口属性“ClassType”上的值创建一个过滤器,该属性在传递给抽象类的每个类中实现。

抽象类定义如下:

public abstract class RepositoryCrudBase<T> : IRepositoryCrudBase<T>  where T : class

搜索方法定义为:

public  async Task<IEnumerable<T>> GetAllAsync(Expression<Func<T, bool>> where)

在 GetAllAsync 方法中,我希望能够使用每个类的基类型的“ClassType”执行 LINQ“where”筛选器,例如

.Where(t => t.ClassType == typeof(T).Name)

但不是查询中的可用属性ClassType

我发现我可以将方法签名修改为以下内容,并且查询按预期工作:

public  async Task<IQueryable<T>> GetAllAsync<T>(Expression<Func<T, bool>> where) where T : IModelBase

但这意味着我将基类型传递到抽象类本身,然后再次传递到方法中,这并不理想。

有没有办法使用传递给抽象类的“ClassType”属性进行查询,而不是将“where T : IModelBase”部分添加到方法中?

C# 泛型

评论

0赞 Andrea Scarcella 3/24/2021
你的问题让我想起了 OfType<T>(见下文)这是正确的吗?如果集合包含不同类型的对象,则可以使用 OfType<T> 仅筛选出该类型的对象。请注意,T不是T型的财产。有关示例 learn.microsoft.com/en-us/dotnet/api/ 请参阅链接...
1赞 Gian Paolo 3/24/2021
我认为使用约束没有问题:您需要访问对象的属性,并且您知道该对象将始终具有该属性,因为您将始终实现IModelBase:也让编译器kwow它并避免任何强制转换。where T : IModelBase
0赞 Gerald St 3/24/2021
我同意添加注释不一定是问题,但这意味着我将类型传递给类,然后传递给方法。我试图了解这是否是唯一的选择,或者是否可以在父抽象类上设置注释,然后能够使用传递给类的类型执行“where”查询?
0赞 3/24/2021
@GeraldSt 为什么说它“将类型传递给类”?你只是在限制类型。你会传入一个不继承的对象吗?IModelBase
1赞 John Wu 3/24/2021
添加约束并不真正修改代码的运行时行为。如果您尝试使用不是 ,它所做的只是 (#1) 导致编译错误,并且 (#2) 因为它可以确定它是 (因为 #1),它允许您访问 的成员。没有任何新东西传入或传出任何东西。TIModelBaseIModelBaseIModelBase

答: 暂无答案