Обработка метода C #, который не определен для динамического объекта (он же response_to / method_missing) - PullRequest
8 голосов
/ 10 июля 2009

Учитывая новую динамическую поддержку в 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 # называет это конкретно. Но возможно ли это?

1 Ответ

17 голосов
/ 10 июля 2009

Абсолютно. Либо реализуйте 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 во 2-й редакции C # в глубине , но я еще не реализовал IDyamicMetaObjectProvider. Я сделаю это перед выпуском книги, но на данный момент в раннем выпуске есть только пример DynamicObject. Кстати, если вы покупаете его сегодня, это полцены - используйте код twtr0711 . Я отредактирую этот ответ позже, чтобы удалить этот бит:)

</plug>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...