2011-02-01 5 views
4

파이썬은 객체가 함수처럼 호출 될 때 호출되는이 마법적인 메소드 __call__을 가지고 있습니다. C#은 비슷한 것을 지원합니까?C#은 __call__ 메서드를 지원합니까?


특히 대리인과 개체를 서로 바꾸어 사용할 수있는 방법이 필요했습니다. 사용자가 함수 목록을 전달할 수있는 API를 설계하려하지만, 때로는 이러한 함수가 초기 매개 변수를 필요로하는 경우가 있습니다.이 경우에는 대신 호출 가능한 객체 중 하나를 사용합니다. 당신이 DynamicObject에서 상속하는 경우 그것을 할 수있는 방법을 보여줍니다 - - 나는 사이먼 스벤손에 활

+0

+1 굉장 질문이 있습니다. – ClosureCowboy

답변

4

보기보다 해협 앞으로 비 동적 포인트 :

죄송 없습니다하지만 -하지만 객체의 유형이있다 그 수 예를 들어 델리게이트 (delegate)라고 불린다.

Func<int, int> myDelagate = x=>x*2; 
int four = myDelagate(2) 

가 비록 기본 속성입니다 - 적어도 하나 개의 매개 변수를 가지고 있어야하고 액세스 배열 액세스 다음과 같습니다

class Test1 
{ 
    public int this[int i, int j] 
    { 
     get { return i * j; } 
    } 
} 

그런 다음 당신이 할 수있는

 Test1 test1 = new Test1(); 
     int six = test1[2, 3]; 

를 호출 위와 같은 대표와 함께 정말 바보 같은 것들 :

class Test2 // I am not saying that this is a good idea. 
{ 
    private int MyFunc(int z, int i) 
    { 
    return z * i; 
    } 
    public Func<int, int> this[int i] { get { return x => MyFunc(x, i); } } 
} 

그런 다음 이런 이상하게 보인다 호출 :

 Test2 test = new Test2(); 
     test[2](2); // this is quite silly - don't use this..... 
3

이 함수 호출 연산자 과부하에 가까운 것 (C++로 가능하다). 불행히도, 이것은 C#에서 지원되는 것이 아닙니다. 메소드와 같이 호출 할 수있는 유일한 객체는 델리게이트의 인스턴스입니다.

+0

나는 다행히도 C#에서는 이것을 할 수 없다는 것을 제외하고는 두 번째 것입니다. :) – Neil

5

물론, DynamicObject을 상속하는 경우 난 당신이 obj(...)에서 실행 TryInvoke 후라고 생각하지만, 여러 가지 다른 당신이 캐스팅을 처리하기 위해 재정의 할 수 있습니다 방법, 인덱스 액세스 (obj[idx]), 메소드 호출, 속성 호출 등

using System; 
using System.Diagnostics; 
using System.Dynamic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication { 
    public static class ConsoleApp { 
     public static void Main() { 
      dynamic x = new MyDynamicObject(); 
      var result = x("awe", "some"); 

      Debug.Assert(result == "awesome"); 
     } 
    } 

    public class MyDynamicObject : DynamicObject { 
     public override Boolean TryInvoke(InvokeBinder binder, Object[] args, out Object result) { 
      result = args.Aggregate(new StringBuilder(), (builder, item) => builder.Append(item), builder => builder.ToString()); 
      return true; 
     } 
    } 
} 
+0

+1 와우! - 역동적 인 힘을 봅니다. 나는 이것을 결코 사용하지 않을 것이다. 그러나 그것은 알고있다. ... – Neil

+0

** + 1! ** 지옥이 무엇 이냐? 서사시. – ClosureCowboy

관련 문제