【发布时间】:2019-12-26 01:48:12
【问题描述】:
如何概括这个函数?我希望Name 属性是可变的,并且有函数接受,用任何类替换persons 类。
// Filtering logic
Func<SampleFilterModel, IEnumerable<Person>> filterData = (filterModel) =>
{
return persons.Where(p => p.Name.StartsWith(filterModel.Term ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))
.Skip((filterModel.Page-1) * filter.Limit)
.Take(filterModel.Limit);
};
其他项目:
IEnumerable<Person> persons = new List<Person>() {
new Person() { Name = "Laura Callahan", DOB = DateTime.Parse("1958-01-09"), Email = "laura.callahan@test.com" },
new Person() { Name = "Anne Dodsworth", DOB = DateTime.Parse("1966-01-27"), Email = "anne.dodsworth@test.com" }
};
public class SampleFilterModel
{
public int Page { get; set; }
public int Limit { get; set; }
public string Term { get; set; }
public SampleFilterModel()
{
this.Page = 1;
this.Limit = 3;
}
public object Clone()
{
var jsonString = JsonConvert.SerializeObject(this);
return JsonConvert.DeserializeObject(jsonString, this.GetType());
}
}
当前尝试,根据需要尝试修改/返工:
给出一些问题/错误:
是否必须将所有变量声明为静态变量?
-
收到错误信息:
“T”不包含“propertyInfo”的定义,并且找不到接受“T”类型的第一个参数的可访问扩展方法“propertyInfo”(您是否缺少 using 指令或程序集引用?)
代码:
public class Filterclass<T> where T : class
{
public static string ColumnName;
public static SampleFilterModel filter = new SampleFilterModel();
public static IEnumerable<T> input;
public Func<SampleFilterModel, IEnumerable<T>> filterData = (filterModel) =>
{
var propertyInfo = input.GetType().GetProperty(ColumnName);
return input.Where(p => p.propertyInfo.StartsWith(filterModel.Term ?? String.Empty, StringComparison.InvariantCultureIgnoreCase))
.Skip((filterModel.Page - 1) * filter.Limit)
.Take(filterModel.Limit);
};
}
【问题讨论】:
-
嗨@VidmantasBlazevicius 试图弄清楚,不确定评论是否会增加价值,几个月前开始编程,对于提出问题的人来说,显示当前尝试meta.stackexchange.com/questions/223480/… 也是一个很好的做法,还是谢谢你
-
阅读 linq 表达式树并动态构建 linq 表达式。
-
除非您使用某种保证 Name 属性存在的合同,否则您将不得不使用反射和动态表达式。
-
嗨@Nkosi 正确,尝试在这里实现它,var propertyInfo = input.GetType().GetProperty(ColumnName);
-
您只是想从
propertyInfo获取值吗?你不应该使用这个:Where(p => p.GetValue(input).StartsWith...吗?
标签: c# .net linq generics .net-core