SetValue
我正在尝试使用 LINQ 表达式加速反射-> 。
我的问题是这种方法:
public void SetValue<T>(T obj)
{
FieldInfo field = typeof(T).GetField("Title", BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.IgnoreCase);
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(field.FieldType, "value");
// Expression.Property can be used here as well
MemberExpression fieldExp = Expression.Field(targetExp, field);
BinaryExpression assignExp = Expression.Assign(fieldExp, valueExp);
var setter = Expression.Lambda<Action<T, string>>(assignExp, targetExp, valueExp).Compile();
setter(obj, "Hello World");
//Console.WriteLine(obj.title);
}
我这样称呼:
var ii = new Controllers.SearchController.InstantItem();
SetValue<Controllers.SearchController.InstantItem>(ii);
问题是这一行:
var setter = Expression.Lambda<Action<T, string>>(assignExp, targetExp, valueExp).Compile();
因为 Action 使用泛型,我不能用field.FieldType
...替换字符串
有没有可能我可以做到这一点而不必switch(field.FieldType)
发表声明,并为每种可能的类型放置一个通用方法,这会浪费很多时间?