gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:01:28 31 4
gpt4 key购买 nike

考虑到 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 documentation一些很好的例子。

这是 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>

我有一个更大的例子 DynamicObject2nd edition of C# in Depth但我还没有实现IDyamicMetaObjectProvider 。我会在这本书发行之前这样做,但抢先体验版只有 DynamicObject目前的例子。顺便说一句,如果您今天购买,可享受半价 - 使用代码twtr0711。我稍后会编辑这个答案以删除该部分:)

<强> </plug>

关于dynamic - 处理未在动态对象上定义的 C# 方法(又名 respond_to/method_missing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110481/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com