如何在 C# 表达式树中设置字段值?

2024-02-19

Given:

FieldInfo field = <some valid string field on type T>;
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "value");

如何编译 lambda 表达式以将“目标”参数上的字段设置为“值”?


.Net 4.0: 现在有了Expression.Assign,这很容易做到:

FieldInfo field = typeof(T).GetField("fieldName");
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "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(subject, "new value");

.Net 3.5:你不能,你必须使用 System.Reflection.Emit 代替:

class Program
{
    class MyObject
    {
        public int MyField;
    }

    static Action<T,TValue> MakeSetter<T,TValue>(FieldInfo field)
    {
        DynamicMethod m = new DynamicMethod(
            "setter", typeof(void), new Type[] { typeof(T), typeof(TValue) }, typeof(Program));
        ILGenerator cg = m.GetILGenerator();

        // arg0.<field> = arg1
        cg.Emit(OpCodes.Ldarg_0);
        cg.Emit(OpCodes.Ldarg_1);
        cg.Emit(OpCodes.Stfld, field);
        cg.Emit(OpCodes.Ret);

        return (Action<T,TValue>) m.CreateDelegate(typeof(Action<T,TValue>));
    }

    static void Main()
    {
        FieldInfo f = typeof(MyObject).GetField("MyField");

        Action<MyObject,int> setter = MakeSetter<MyObject,int>(f);

        var obj = new MyObject();
        obj.MyField = 10;

        setter(obj, 42);

        Console.WriteLine(obj.MyField);
        Console.ReadLine();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 表达式树中设置字段值? 的相关文章

随机推荐

  • dnx/dotnetcore 包缓存位置可以更改吗

    我的计算机的 C 驱动器空间不足 我想将 DNX DOTNET 软件包的安装位置更改为 D 驱动器下的位置 包缓存位置可以配置吗 注意 我无法灵活地将我的配置文件位置更改为不同的驱动器 Use the NUGET PACKAGES环境变量并
  • Java比较两个地图

    在java中 我想比较两个地图 如下所示 我们是否有现有的API来执行此操作 Thanks Map
  • 如何修改GitBook中的字体大小?

    正如标题所示 有一个名为 编辑配置 的首选项GitBook https www gitbook io 编辑 它说你应该使用 json 来构建book json 我该如何编写这个文件来修改字体大小 在网上搜索了一下 几乎没有找到任何有用的文章
  • 如何在 Linux Bash 中将 ls 分配给数组?

    array ls d echo array 我有三个目录 ww ee qq 我希望它们位于一个数组中 然后打印该数组 会是这个 array ls d 编辑 参见戈登 戴维森的解决方案 https stackoverflow com a 18
  • 如何在禁用组框时禁用组框文本?

    我面临组框文本的问题 我通过调用 EnableWindow FALSE 禁用了组框 问题是组框标题没有变灰 谁能告诉我为什么会发生这种情况以及如何摆脱这个问题 这似乎是 comctrl32 dll 中的一个错误视觉风格 https lear
  • 当应用程序在后台时,iPhone PresentLocalNotificationNow 不会触发警报和声音

    我有一个应用程序注册位置更新 运行测试 有时当我在应用程序处于后台时进入某个区域时 我会收到带有声音的警报通知 有时我只在通知中心看到通知 而没有收到任何声音和警报 您可以做什么来始终收到声音和警报通知 这就是我的看法 UILocalNot
  • android Rect.intersect 始终为 false

    士兵级 centerX speedX r set centerX centerY 50 50 子弹级 centerX speedX r set centerX centerY 50 50 if Rect intersects r GameS
  • MVC 中的 ViewModel 和与实体框架的一对多关系?

    我有一个用于在数据库中存储有关顾问的信息的应用程序 该模型是一个实体框架模型 数据库表与许多其他表 工作经验 计划 能力区域等 具有一对多关系 现在 当我想在视图中创建一个新的 Consultant 对象时 我实际上只想将 Consulta
  • 如何仅使用串行控制台将二进制闪存文件发送到嵌入式系统?

    我有一个使用 ramdisk 启动的嵌入式 Linux 系统 因此它运行时没有可用的持久存储 它有闪存来存储内核和 ramdisk 唯一的连接是 RS 232 串行登录控制台 所以我受到其内置 busybox 提供的功能的限制 我想检索 r
  • UILabel 文本在更新时重叠?

    在我的应用程序中 我将文本标签的值从初始值 0 更改为触摸事件时递增 有时 但并非总是如此 新值会覆盖在 0 上 这并不酷 这是相关代码 UITableViewCell cell tableView cellForRowAtIndexPat
  • 在 C++ 中获取文本 CSV 文件中的字符串

    我有一个这样的大型 CSV 75 MB 1 3 4 1 5 4 2 4 0 1 11 3 我用这段代码存储我的数据 C风格 include
  • 如何保护 Laravel 环境文件中存储的数据库凭据的安全?

    我最近切换到基于环境的 Laravel 应用程序部署 并决定使用 ENV 将本地和生产服务器的凭据存储在 env 文件中 但是我发现打开调试时会抛出异常显示公开数据库凭据的环境变量 现在我确信调试将始终在生产中关闭 因为这是我的默认设置 然
  • Firebase - 获取用户时权限被拒绝

    我正在尝试使用此代码从 Firebase 数据库中获取用户 但出现此错误 取消错误错误域 com firebase代码 1 权限被拒绝 UserInfo NSLocalizedDescription 权限被拒绝 我的规则应该如何设置 这是代
  • 清单的 Robolectric @Config 路径值

    我正在尝试运行 robolectric 单元测试 但收到错误 因为在路径上找不到 AndroidManifest xml 任何人都可以给我一个 Config 清单值的示例路径 是相对路径还是绝对路径 提前致谢 如果您使用 Maven 来运行
  • Java - 复制 JPG 同时保留所有文件属性

    在保持文件所有属性 创建日期 日期等 的同时移动 复制文件的最佳方法是什么 谢谢 如果您使用的是 Java 7 请使用java nio file Files copy Path source Path target CopyOption o
  • jsp页面多语言支持

    在JSP页面中使用上述指令时 无法在JSP页面中显示俄语和匈牙利语字符 有没有办法在同一个JSP页面中支持俄语和匈牙利语字符 如果我使用charset UTF8 好吧 或者还有其他办法吗 ISO 8859 1 字符集支持only列出的字符h
  • 检测 Windows 字体大小(100%、125% 和 150%)

    我创建了一个应用程序 该应用程序在用户选择 125 或 150 之前都可以完美运行 这会破坏我的申请 后来我找到了通过检测DPI来找到字体大小的方法 在使用中文版 Windows 7 的用户开始使用我的应用程序之前 这种方法一直运行良好 整
  • python在函数中存储变量并稍后使用它[重复]

    这个问题在这里已经有答案了 是否可以将 while 循环中的变量存储到函数中 然后在循环结束时从函数中调用同一变量 例如 在 while 循环期间 这里的问题是 当我尝试从 store 检索变量时 它失败了 因为它需要传递参数 def st
  • 如何取消长时间运行的数据库操作?

    目前正在与 Oracle 合作 但还需要 MS SQL 的解决方案 我有一个 GUI 允许用户生成将在数据库上执行的 SQL 这可能需要很长时间 具体取决于它们生成的搜索 我希望 GUI 应用程序在此搜索期间做出响应 并且希望用户能够取消搜
  • 如何在 C# 表达式树中设置字段值?

    Given FieldInfo field