考虑到 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(使用前将#替换为@)