C# 思维弯曲器 : Compile string to assignment expression at runtime

标签 c#

假设我有以下 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/

相关文章:

c# - 将 Youtube/Vimeo 视频嵌入电子邮件模板

c# - 更改结构的大小是 C# 中的重大更改吗?

c# - 在 Chrome 浏览器中运行测试时,编码的 Ui 播放无法找到给定的搜索控件

c# - 如何打开最大化的 Internet Explorer?

c# - 我可以从两个字符的语言代码创建一个新的 CultureInfo 吗?

c# - 你能有 2 个 url 指向 asp :Menu control? 中的同一页面吗

c# - 在应用程序中重命名树节点时重命名文件夹名称

c# - 如何在 Xamarin Cocoa 应用程序中获取设备宽度和高度

c# - 可插拔 .NET 4.5 功能区

c# - 使用通用处理程序从服务器下载文件