如何使用动态类型在C#4.0中调用静态方法?

14
在C#4.0中,我们有动态类型,但是如何调用动态类型对象的静态方法?
下面的代码会在运行时生成异常。dynamic对象来自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));

    }
}

我认为,“动态”这个概念是为了弥补C#和其他编程语言之间的差距而创造的。有些语言(如Java)允许通过对象调用静态方法而不是类型。

顺便说一下,与C#3.0相比,C#4.0的介绍并不那么令人印象深刻。

3个回答

13

10

虽然C#不支持,但DLR支持。您可以使用Dynamitey以编程方式访问dlr调用。

var staticContext = InvokeContext.CreateStatic ;

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

7

一个可能的解决方法是使用反射。

dynamic d = new Foo();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接