我有两种非常相似的方法。我想根据实体的某个属性是null还是空字符串返回实体。但是,不共享实体的属性。所有属性都是字符串。
public List<Phone> GetPhones(){
return context.Phones
.Where(p=> !(p.Number == null
|| p.Number.Trim() == String.Empty))
.ToList();
public List<Remote> GetRemotes(){
return context.Remotes
.Where(r => !(r.OEM == null
|| r.OEM.Trim() == String.Empty))
.ToList();
}
是否可以创建如下方法:
public List<T> GetEntities(string property){
return ...
}
答案 0 :(得分:1)
访问字符串属性可以通过反射来完成: Get property value from string using reflection in C#
您尝试做的事情的问题是,除了要访问的属性之外,每个调用的对象的源都不同。要编写通用函数,您必须提供方法的源代码以及属性名称。
更好的方法可能是编写一个辅助方法,该方法使用source和lambda表达式来获取适当的属性:
public List<T> GetListOfNonEmpties<T>(IEnumerable<T> source, Func<T, string> property)
{
return source.Where(n => !(property(n) == null
|| property(n).Trim() == String.Empty))
.ToList();
}
然后在你的其他方法中使用它:
public static List<Phone> GetPhones()
{
return GetListOfNonEmpties(context.Phones, p => p.Number);
}
public static List<Remote> GetRemotes()
{
return GetListOfNonEmpties(context.Remotes, r => r.OEM);
}
答案 1 :(得分:1)
是的,但以下可能是一个更好的通用解决方案:
public IQueryable<Phone> GetPhones(){
return context.Phones
.Where(p=> !String.IsNullOrWhiteSpace(p.Number));
}
public IQueryable<Remote> GetRemotes(){
return context.Remotes
.Where(r => !String.IsNullorWhiteSpace(r.OEM));
}
它返回IQueryable而不是List,因此如果你想对它进行进一步的限制,可以延迟执行以包含它们。一个“帮助器”函数来概括你要求的功能并不比在字符串上使用String.IsNullOrWhiteSpace函数更简洁或更简洁。假设您的上下文是数据库,特别是远程数据库,这是一个重大改进。如果你现在没有进一步的限制,你可能(可能会?)将来。