我想加快反思 - >SetValue
與LINQ表達式。如何使用LINQ從類型對象創建lambda表達式?
我的問題是這樣的方法:
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 setter = Expression.Lambda<Action<T, string>>(assignExp, targetExp, valueExp).Compile();
由於操作使用泛型,我不能用field.FieldType
替換字符串...
有沒有可能做到這一點,而不必做出switch(field.FieldType)
聲明,併爲每種可能的類型添加一個通用方法,這會吸引大量時間?
編譯動態方法比使用反射慢,如果你每次都做。我認爲你需要緩存setter。 – usr
@usr:的確如此,但我可能擔心稍後將其緩存。現在我需要先創建它。 –