동적 객체에서 정의되지 않은 C# 메소드 처리 (AKA respons_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 support"라고 부릅니다. C#이 무엇을 구체적으로 부르는지 잘 모르겠습니다. 그러나 가능합니까?
해결책
전적으로. 도 구현 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
에서 C# 깊이의 2 판 그러나 아직 구현하지 않았습니다 IDyamicMetaObjectProvider
. 책이 출시되기 전에 그렇게하겠습니다. 그러나 초기 액세스 에디션에는 DynamicObject
현재 예. BTW, 오늘 구매하면 절반 가격입니다. 코드를 사용하십시오. TWTR0711. 나중에이 답을 편집하여 그 비트를 제거하겠습니다. :)
</plug>
제휴하지 않습니다 StackOverflow