Обработка метода 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>