【发布时间】:2012-06-18 13:31:30
【问题描述】:
我正在尝试使用 LINQ 表达式加速反射 -> SetValue。
我的问题是这个方法:
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) 声明,并为每种可能的类型放置一个通用方法,这会浪费很多时间?
【问题讨论】:
-
编译动态方法比每次都使用反射要慢得多。我认为您需要缓存设置器。
-
@usr: 是的,但我可以担心以后缓存它。现在我需要先创建它。
标签: c# .net linq generics linq-expressions