处理未在动态对象上定义的 C# 方法(又名 respond_to/method_missing)

2023-11-25

考虑到 C# 4 中新的动态支持,是否可以以这样的方式编写一个类:如果在实例上调用方法并且该方法不存在,则将调度传递给另一个方法?这可能看起来像:

public class Apple : ... {
  // ...

  private ... MethodMissing(string name, ...) {
    if (name == "TurnIntoOrange") {
      // do something
    }
  }
}

dynamic d = new Apple();
d.TurnIntoOrange();       // Not actually defined on Apple; will pass to MethodMissing.

其他语言将其称为“method_missing support”,在更通用的元编程标题下。我不确定 C# 具体是怎么称呼它的。但这可能吗?


绝对地。要么实施IDynamicMetaObjectProvider或源自DynamicObject以获得更简单的路线。请参阅DLR 文档一些很好的例子。

这是一个简单的例子DynamicObject:

using System;
using System.Dynamic;

public class MyDynamic : DynamicObject
{
    public override bool TryInvokeMember
        (InvokeMemberBinder binder,
         object[] args,
         out object result)
    {
        Console.WriteLine("I would have invoked: {0}",
                          binder.Name);
        result = "dummy";
        return true;
    }

    public string NormalMethod()
    {
        Console.WriteLine("In NormalMethod");
        return "normal";
    }
}

class Test
{
    static void Main()
    {
        dynamic d = new MyDynamic();
        Console.WriteLine(d.HelloWorld());
        Console.WriteLine(d.NormalMethod());
    }
}

<plug>

我有一个更大的例子DynamicObject in the 《C# 深入》第二版但我还没有实施IDyamicMetaObjectProvider。我会在这本书发行之前这样做,但抢先体验版只有DynamicObject目前的例子。顺便说一句,如果你今天购买它是半价 - 使用代码twtr0711。我稍后会编辑这个答案以删除该部分:)

</plug>

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

处理未在动态对象上定义的 C# 方法(又名 respond_to/method_missing) 的相关文章

  • 在.rdlc报告的底部设置一个文本框

    我在 rdlc 报告中使用 tablix 有一个文本框 其中包含文本 签名 我想将此文本框放置在报告最后一页的底部 就在页脚之前 我已经用谷歌搜索了这个解决方案 但没有找到满意的结果 我的环境是VS2010 framework 4 0 有什
  • 如何使用C#在asp.net中下载xml文件

    我正在使用网络应用程序ASP NET 与 MVC3 我是 mvc3 的新手 我的网页上有一个下载按钮 当我要单击下载按钮时 我希望能够打开该 XML 文件 我尝试过一些代码更改动作结果但我没有打开文件 通过使用下面提到的代码 我收到一个下载
  • 如何在 C# 中将 ListView 与目录和文件绑定

    我想在 C 的 ListView 中绑定 C 驱动器中的所有目录和文件 我的代码是 protected void Page Load object sender EventArgs e DirectoryInfo di new Direct
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 监听来自动态vue组件的事件

    您将如何侦听动态创建的组件实例发出的事件 在示例中 顶部组件添加到 DOM 中 而第二个组件是在 javascript 中动态创建的 Vue component button counter data function return cou
  • 如何动态添加和删除jquery选项卡?

    我有一个 aspx 页面 上面有 2 个静态 jquery 选项卡 单击其中一个选项卡上的按钮后 我想动态添加一个新选项卡 该选项卡从另一个 aspx 页面加载其内容 我也尝试使用以下示例 http jquery ui googlecode
  • C# 获取 Console.Writeline(" ") 说话 (" ")

    case Start VS Console WriteLine Starting Visual Studio s System Diagnostics Process Start devenv exe break 我怎样才能使用字符串输入来
  • 如何打开带有预填充附件的 Outlook 新邮件窗口

    当用户单击我的应用程序中的某些按钮或链接时 我需要打开一个带有预填充附件的新电子邮件窗口 老问题 但我也遇到了这个问题 所以这里有一个复制和粘贴解决方案 Microsoft Office Interop Outlook Applicatio
  • 如何将一个div的内容克隆到另一个div

    我想使用jquery克隆将选定div的内容复制到另一个div 但我不想将它附加到任何地方 我的意思是 当我们用 jquery 克隆一个 div 时 如果我错了 请纠正我 我们必须设置它的位置 它将动态创建一个显示的新分区 但我想获取所选di
  • 从值获取键 - Dictionary>

    我无法通过指定值来获取密钥 我实现这一目标的最佳方法是什么 var st1 new List
  • SearchBoxControl 专注于在 Win8.1 上启动应用程序

    我在 Windows 8 1 应用程序中使用新的 SearchBox 控件 但每次启动应用程序时 SearchBox 都会获得焦点并显示搜索历史记录 我尝试将焦点设置在页面上的另一个控件上 但它不起作用 那么如何在不显示搜索历史记录的情况下
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 演示如何在 C# 4.0 中使用新的“dynamic”关键字

    这是 4 0 版本中新的 C 未来 称为动态 告诉我如何在我的代码中使用它以及这个未来可以如何帮助我 相关问题 新的 dynamic C 4 0 关键字是否弃用了 var 关键字 https stackoverflow com questi
  • 如何将 Emgu.Cv.Image 转换为 System.Image

    我是 Emgu Cv 的新手 我想知道是否有人可以让我知道如何将 Emgu Cv Image 更改为 System Image 如果需要进一步解释 请告诉我 我会这样做 我的语言我使用的是C 你可以只使用ToImage 方法得到一个Syst
  • 直接将 XML 写入磁盘并附加元素

    我正在尝试编写一个 XML 文件 但它太大而无法存储在内存中 因此我想将其直接写入磁盘 我尝试过使用 XmlWriter 但没有功能使我能够附加到文件末尾 因此我愿意使用常规文件编写器来编写 XML 原始数据 有谁知道任何文件写入类使我能够
  • 在 C# 中将平面数据库结果集转换为分层对象集合

    我有一个数据库查询 它以平面格式返回分层数据 例如客户 订单和订单项目 只是一个例子 我的数据不同 如何将其转换为分层对象集合 即客户对象的集合 其中每个客户对象都有订单对象的集合 每个订单对象都有订单项目对象的集合 这只是循环遍历每个项目
  • 将 SqlDataReader 中的数据放入 HTML 表中

    我在数据库中有一些数据可以用来读取SqlDataReader 我想将它们放入我的 ASP NET 站点的 HTML 表中 但我不知道该怎么做 您可以使用网格视图 它是一个 asp net 控件 您只需将 datareader 绑定到 gri
  • 在 Actionscript-3 中优化 2D Flash 游戏的动态背景引擎

    编辑2 根据缺乏回复来判断 我开始怀疑我的问题是否足够清楚 请告诉我是否需要详细说明 注意 请参阅底部以获取代码更新 简短介绍 我正在用 ActionScript 编写一个二维 Flash 空间游戏 宇宙无限大 由于这个特性 背景必须动态渲
  • 如何在 Eclipse 项目之间共享 Web 内容

    虽然 J2EE 模块参考功能允许您创建常见的 Java 库项目 但我找不到针对 Web 内容执行此操作的巧妙方法 我有通用的 JSP CSS 文件 JavaScript 库 甚至是描述符片段 我想在多个动态 Web 项目中使用它们 因此这些

随机推荐