假设我有以下 C# 代码:
//build an object
var mynewObj = new Thing();
//build an assignment value
var val = "abc";
var memberExpression = "x.PropertyX.Id = y";
[? some stuff happens ?]
Assert.IsTrue(myNewObj.PropertyX.Id == "abc");
memberExpression 是某些数据库中的一个值。我想获取这些片段,构建一个表达式,然后编译/执行它。我需要每秒执行此操作约 30 次,持续数小时,因此它必须快速且占用内存少。
最佳答案
最好的办法是使用表达式来构建一个 Action ,编译并缓存它。下面是一个稍微简化的示例,说明如何执行此操作。在这种情况下,我只在属性图中深入一层。
/// <summary>
/// Build a lambda expression for a setter
/// </summary>
public static Action<T, U> GetSetter<T, U>(string propertyName)
{
// TODO: Maintain a dictionary mapping typeof(T)+property onto the
// resulting Action so this can be cached
PropertyInfo property = typeof(T).GetProperty(propertyName);
var setMethod = property.GetSetMethod();
var parameterT = Expression.Parameter(typeof(T), "x");
var parameterU = Expression.Parameter(typeof(U), "y");
var newExpression =
Expression.Lambda<Action<T, U>>(
Expression.Call(parameterT, setMethod, parameterU),
parameterT,
parameterU
);
return newExpression.Compile();
}
使用它:-
//build an object
var mynewObj = new Thing();
//build an assignment value
var val = "abc";
var propertyName = "PropertyX";
var setter = GetSetter<Thing, string>(propertyName);
// Execute the cached setter (it's really fast!)
setter(mynewObj, val);
Debug.Assert(mynewObj.PropertyX == "abc") ;
关于C# 思维弯曲器 : Compile string to assignment expression at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861174/