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

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

1 ответ

Решение

Абсолютно. Либо реализовать 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>

Другие вопросы по тегам