linq - C# how to filter a list by different properties at runtime -
im pretty new c#/unity forgive me.
im writing filtering system filter list of properties of class @ runtime. im planning on building kind of whereclause filter lists (i know hit server list need, want filter data have)
say have list of class "myclass" 4 properties: "param1".."param4"
if wanted filter param1 , param2 do:
list<myclass> mylist = new list<myclass>(existinglist); mylist = mylist.where(g => g.param1 == somevalue && g.param2 == someothervalue).tolist();
how generate same clause @ runtime?
thank you!
you can write extension method this:
public static ienumerable<t> where<t>(this ienumerable<t> source, string propname, object value) { var type = typeof(t); var propinfo = type.getproperty(propname,bindingflags.ignorecase | bindingflags.public | bindingflags.instance); var parameterexpr = expression.parameter( type, "x" ); //x var memberaccessexpr = expression.makememberaccess( parameterexpr, propinfo ); //x.prop var lambda = expression.lambda( expression.equal(memberaccessexpr, expression.constant(value)), parameterexpr ); //x=>x.prop==value var mi = typeof(enumerable) .getmethods() .where(m => m.name == "where") .first(m => m.getparameters().count() == 2) .makegenericmethod(type); return (ienumerable<t>)mi.invoke(null, new object[] { source, lambda.compile() }); }
you can use as
var test = new[] { new { = 1 }, new { = 2 } }.where("a", 1).tolist();
Comments
Post a Comment