2010-05-13 5 views
10

C# 4.0에는 동적 유형이 있지만 동적 유형 객체의 정적 방법을 호출하는 방법은 무엇입니까?C# 4.0에서 동적 메서드로 정적 메서드를 호출하는 방법은 무엇입니까?

아래 코드는 런타임에 예외를 생성합니다. 동적 인 개체는 C# 클래스에서 왔지만 DLR을 통해 다른 언어의 개체 일 수 있습니다. 요점은 정적 메서드를 호출하는 방법이 아니라 동적 메서드의 정적 메서드를 호출하는 방법을 C# 코드에서 만들 수 없습니다.

class Foo 
{ 
    public static int Sum(int x, int y) 
    { 
     return x + y; 
    } 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     dynamic d = new Foo(); 
     Console.WriteLine(d.Sum(1, 3)); 

    } 
} 

IMHO, 동적는 C# 및 다른 프로그래밍 언어를 해소하기 위해 개발된다. 다른 언어 (예 : Java)에서 유형 대신 객체를 통해 정적 메소드를 호출 할 수 있습니다.

BTW, C# 4.0은 C# 3.0에 비해 인상적이지 않습니다.

답변

6

한 가지 가능한 해결 방법은 반사를 사용하는 것입니다.

dynamic d = new Foo(); 

var sum = (int)d.GetType() 
       .GetMethod("Sum") 
       .Invoke(d, new object[] { 1, 3 }); 
Console.WriteLine(sum); 
8

C#은 지원하지 않지만 DLR은 지원합니다. Dynamitey

var staticContext = InvokeContext.CreateStatic ; 

Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3)); 
을 사용하여 프로그래밍 방식으로 dlr 호출에 액세스 할 수 있습니다.
관련 문제