동적 객체에서 정의되지 않은 C# 메소드 처리 (AKA respons_to/method_missing)

StackOverflow https://stackoverflow.com/questions/1110481

  •  12-09-2019
  •  | 
  •  

문제

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>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top