Ответ 1
Это не поддерживается непосредственно С# 4, но есть интересное обходное решение в этом сообщении в блоге: http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx
В С# 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.
Это не поддерживается непосредственно С# 4, но есть интересное обходное решение в этом сообщении в блоге: http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx
Пока С# не поддерживает его, DLR делает. Вы можете программным образом обращаться к вызовам dlr с помощью Dynamitey
var staticContext = InvokeContext.CreateStatic ;
Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3));
Одним из возможных способов решения проблемы было бы использование отражения.
dynamic d = new Foo();
var sum = (int)d.GetType()
.GetMethod("Sum")
.Invoke(d, new object[] { 1, 3 });
Console.WriteLine(sum);