鉴于C#4中的新动态支持,是否可以以这样的方式编写类:如果在实例上调用方法并且该方法不存在,则将dispatch传递给另一个方法?这看起来像是这样的:
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.
Run Code Online (Sandbox Code Playgroud)
在元编程的更一般标题下,其他语言称之为"method_missing support".我不确定C#特意称之为什么.但这可能吗?
Jon*_*eet 17
绝对.为更简单的路线实现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());
}
}
Run Code Online (Sandbox Code Playgroud)
<plug>
我DynamicObject在第二版C#深度中有一个更大的例子,但我还没有实现IDyamicMetaObjectProvider.我会在本书发布之前这样做,但早期的访问版本目前只有DynamicObject示例.顺便说一句,如果你今天购买它的价格是半价 - 使用代码twtr0711.我稍后会编辑这个答案来删除那个位:)
</plug>
| 归档时间: |
|
| 查看次数: |
1819 次 |
| 最近记录: |