创建属性设置器委托

2024-01-29

我创建了将属性 lambda 转换为委托的方法:

public static Delegate MakeGetter<T>(Expression<Func<T>> propertyLambda)
{
    var result = Expression.Lambda(propertyLambda.Body).Compile();
    return result;
}

public static Delegate MakeSetter<T>(Expression<Action<T>> propertyLambda)
{
    var result = Expression.Lambda(propertyLambda.Body).Compile();
    return result;
}

这些工作:

Delegate getter = MakeGetter(() => SomeClass.SomeProperty);
object o = getter.DynamicInvoke();

Delegate getter = MakeGetter(() => someObject.SomeProperty);
object o = getter.DynamicInvoke();

但这些不会编译:

Delegate setter = MakeSetter(() => SomeClass.SomeProperty);
setter.DynamicInvoke(new object[]{propValue});

Delegate setter = MakeSetter(() => someObject.SomeProperty);
setter.DynamicInvoke(new object[]{propValue});

MakeSetter 行失败并显示“无法从用法推断类型参数。请尝试显式指定类型参数。”

我想做的事情可能吗?提前致谢。


The ExpressionAPI 在 .NET 4.0 中支持这一点,但遗憾的是 C# 编译器没有添加任何额外的支持。但好消息是,您可以轻松地采用“get”表达式(C# 编译器canwrite)并将其重写为“集合”表达式。

甚至更好;如果你没有.NET 4.0,还有at least通过写为“get”的表达式执行“set”的另外两种方法。

它们都在这里,供参考:

using System;
using System.Linq.Expressions;
using System.Reflection;
class Foo {
    public string Bar { get; set; }
    static void Main() {
        // take a "get" from C#
        Expression<Func<Foo, string>> get = foo => foo.Bar;

        // re-write in .NET 4.0 as a "set"
        var member = (MemberExpression)get.Body;
        var param = Expression.Parameter(typeof(string), "value");
        var set = Expression.Lambda<Action<Foo, string>>(
            Expression.Assign(member, param), get.Parameters[0], param);

        // compile it
        var action = set.Compile();
        var inst = new Foo();
        action(inst, "abc");
        Console.WriteLine(inst.Bar); // show it working

        //==== reflection
        MethodInfo setMethod = ((PropertyInfo)member.Member).GetSetMethod();
        setMethod.Invoke(inst, new object[] { "def" });
        Console.WriteLine(inst.Bar); // show it working

        //==== Delegate.CreateDelegate
        action = (Action<Foo, string>)
            Delegate.CreateDelegate(typeof(Action<Foo, string>), setMethod);
        action(inst, "ghi");
        Console.WriteLine(inst.Bar); // show it working
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建属性设置器委托 的相关文章

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • PHP sprintf 转义%

    我想要以下输出 即将从您的充值账户中扣除 27 59 欧元的 50 当我做这样的事情时 variablesArray 0 variablesArray 1 27 59 stringWithVariables About to deduct
  • 如何在 QEMU 中模拟 TrustZone?

    我正在尝试在 Qemu 中模拟 TrustZone 功能 我发现两个链接似乎解释了这个过程 第一个参考 http www linaro org blog core dump arm trustzone qemu 未附加支持 TrustZon
  • 关于函数调用堆栈的困惑

    根据维基百科 调用者将返回地址压入堆栈 而被调用者 子例程完成后 从调用中弹出返回地址 堆栈并将控制权转移到该地址 图片来自维基 我不太明白这一点 假设我有一个 C 程序如下 include
  • 将十六进制值的行垂直按列转换为二进制

    我正在处理来自串行设备的数据 该设备以非常有趣的格式输出数据 该设备有一个 256x256 的像素阵列 而每个像素都有一个14 bit值 用移位寄存器读出 为了显示格式 我将对其进行说明 就像每个像素都有一个6 bit value Pixe
  • VBA - 导入带有特殊字符的bas模块

    我已经为 excel 模块 bas frx 和 frm 文件 实现了自动导入 版本控制 因此客户将始终获得最新版本的 VBA 脚本 解决方案是这样的 vba 脚本 在 Workbook Open 上 检查 github 存储库版本号是否相等
  • 如何一起使用 requireJS 和 jQuery?

    我想使用 requireJS 并且我正在使用 jQuery 我不想使用 requireJS 和 jQuery 的组合版本 因为我没有使用最新的 jQuery 版本 使用 requireJS 的最佳方式是什么 这也是我的确切问题 我还必须使用
  • 如何确定 Wix 中是否存在注册表项

    我想确定 Wix 中是否存在注册表项 我无法对该键中的值名称做出任何假设 但至少存在一个 未设置默认值 是否可以在不使用自定义操作的情况下检查密钥是否存在 以及可选地 是否有任何值 看看注册表搜索 使用样本
  • 在 VB.NET 中创建一个新线程

    我正在尝试使用匿名函数创建一个新线程 但我不断收到错误 这是我的代码 New Thread Function Do something here End Function Start 以下是我得到的错误 New 语法错误 结束功能 结束函数
  • iPhone SDK:如何检查用户输入的IP是否有效?

    我的 iPhone 应用程序包含多个对服务器的 http 请求 服务器的IP地址可以由用户输入 这样您就可以将应用程序与您自己的私人服务器结合使用 在发出请求之前 我总是检查输入的 IP 地址是否有效 我这样做 BOOL urlExists
  • Mandrill 发送电子邮件时出现问题:消息未发送:已排队

    我在使用 Mandrill 发送电子邮件时遇到问题 我创建了一个帐户和一个新模板 但是当我尝试发送该模板的测试时 即使我曾经发送过电子邮件 我也会收到以下消息 消息未发送 已排队 我为具有相同 pb 的人修复了此问题 我向 Mandrill
  • 无法停止为静态内容触发 ASP.NET 模块

    我在 ASP NET MVC 应用程序中有一个模块 该模块工作正常 但它会针对包括静态内容在内的每种类型的文件触发 即使我有
  • JavaScript 中的函数顺序

    我的问题是基于一本书中的例子 面向对象的 JavaScript https rads stackoverflow com amzn click com 1847194141 第 81 页 词汇范围 所以 我从这个例子中了解到 functio
  • Android Studio 4.1 中缺少 Logcat

    我最近在我的 Windows 机器上安装了 AS 我尝试在 Logcat 中查看我的日志 但无法找到 激活 Logcat 我尝试按照说明进行操作here https stackoverflow com questions 16817566
  • WPF DataGrid - 插入数据网格时突出显示新行

    我有一个绑定到 ObservableCollection 的数据网格 我想做的是在将新行添加到数据网格时 即 当将新对象插入到 ObservableCollection 中时 突出显示新行 我想在插入行时突出显示行 方法是最初更改背景颜色
  • 有没有办法使导航栏徽标响应?

    这是我使用 bootstrap 4 构建的网站 我对徽标有一个大问题 因为它在所有设备上保持相同的大小 我尝试过添加 img fluid 但是如果添加这个类 徽标在手机上会缩小很多 看起来就像一个小点 所以我删除了这个类 现在 在移动设备上
  • 通用 Promise 重试逻辑

    我试图弄清楚如何创建一个通用重试函数 该函数对于传递给它的任何承诺都会呈指数级回退 看起来除了几件事之外一切都正常 如果该函数在第一次尝试时解析 那么我会看到我的解析值 并且它会输出嘿 这是预期的 如果它在任何后续调用中解决 它不会注销嘿
  • 使用 yajl-objc 编码自定义类

    Summary 基于一些基准 http samsoff es posts updated iphone json benchmarks 我选择了yajl objc http github com gabriel yajl objc用于我的
  • android.view.WindowManager$BadTokenException 异常。有什么指针吗?

    我有两个 webview 为了从两个 webview 中删除通用功能 我创建了一个超类 其中包含超类中的所有方法 并在两个 webview 中使用它 有一次 当我创建对象并设置第一个 Web 视图中的变量时 Web 视图正确显示 当我按 返
  • Javascript 闭包/变量作用域问题 - 我知道它有效,但为什么?

    我用 JS 开发已经有一段时间了 虽然我知道下面的代码可以工作 但我不太明白why有用 在我看来 我在 testClosure 函数中定义了 testString 并且我期望该变量在 testClosure 函数完成时 消失 因为它是局部变
  • 创建属性设置器委托

    我创建了将属性 lambda 转换为委托的方法 public static Delegate MakeGetter