Как вызвать статический метод в C # 4.0 с динамическим типом? - PullRequest
12 голосов
/ 13 мая 2010

В C # 4.0 у нас есть динамический тип, но как вызвать статический метод объекта динамического типа?

Код ниже будет генерировать исключение во время выполнения. динамический объект относится к классу C #, но это может быть объект из других языков через DLR. Дело не в том, как вызвать статический метод, а в том, как вызвать статический метод объекта dynamic , который не может быть создан в коде 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));

    }
}

ИМХО, динамический изобретен для соединения C # и других языков программирования. Существует некоторый другой язык (например, Java), позволяющий вызывать статический метод через объект вместо типа.

Кстати, внедрение C # 4.0 не так впечатляет по сравнению с C # 3.0.

Ответы [ 3 ]

13 голосов
/ 13 мая 2010

Это не поддерживается непосредственно C # 4, но в этом сообщении есть интересный обходной путь: http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx

9 голосов
/ 24 июня 2011

Хотя C # не поддерживает это, DLR поддерживает.Вы можете программно получить доступ к вызовам dlr с помощью Dynamitey

var staticContext = InvokeContext.CreateStatic ;

Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3));
7 голосов
/ 13 мая 2010

Одним из возможных путей решения этой проблемы является использование отражения.

dynamic d = new Foo();

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