Как вызвать статический метод в С# 4.0 с динамическим типом?

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

Ниже код генерирует исключение во время выполнения. динамический объект относится к классу С#, но может быть объектом с других языков через DLR. Дело не в том, как вызвать статический метод, а как вызвать статический метод динамического объекта, который не может быть создан в коде С#.

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, динамический изобретен, чтобы скрестить С# и другой язык программирования. Существует и другой язык (например, Java), который позволяет вызывать статический метод через объект вместо типа.

BTW, введение С# 4.0 не столь впечатляет по сравнению с С# 3.0.

Ответ 2

Пока С# не поддерживает его, DLR делает. Вы можете программным образом обращаться к вызовам dlr с помощью Dynamitey

var staticContext = InvokeContext.CreateStatic ;

Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3));

Ответ 3

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

dynamic d = new Foo();

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