Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic 处理非'的C#方法;在动态对象上定义的t(aka respond_to/method_missing)_Dynamic_C# 4.0 - Fatal编程技术网

Dynamic 处理非'的C#方法;在动态对象上定义的t(aka respond_to/method_missing)

Dynamic 处理非'的C#方法;在动态对象上定义的t(aka respond_to/method_missing),dynamic,c#-4.0,Dynamic,C# 4.0,考虑到C#4中新的动态支持,是否有可能以这样的方式编写类:如果在实例上调用了一个方法,而该方法不存在,则将分派传递给另一个方法?这可能看起来像: public class Apple : ... { // ... private ... MethodMissing(string name, ...) { if (name == "TurnIntoOrange") { // do something } } } dynamic d = new Apple

考虑到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#具体怎么称呼这个。但这可能吗?

绝对可能。实现或派生一个更简单的路由。有关一些好的示例,请参见

下面是
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());
    }
}

我在中有一个更大的
DynamicObject
示例,但我还没有实现
metaobjectprovider
。我会在本书发行之前这样做,但是早期的access版本目前只有
DynamicObject
示例。顺便说一句,如果你今天买它,它的半价-使用代码twtr0711。稍后我将编辑此答案以删除该位:)


我在标题中提到了这一点,但没有在正文中直接询问:是否有类似的覆盖,我会用来模拟“responses\u to”方法。?我知道我可以检查TryInvokeMember的结果,但这可能会导致不良的副作用。不,我不相信有任何方法可以询问动态方法是否可以处理任何事情-尽管可以从调用GetDynamicMemberNames开始。GetDynamicMemberNames()是可选的,也就是说,从DynamicObject继承的类可以根据需要重写它,但如果不重写,则调用基类中的函数,返回空列表。