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

时间:2010-05-13 08:33:26

标签: c# .net dynamic 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));

    }
}

恕我直言,动态是为了弥合C#和其他编程语言而发明的。还有一些其他语言(例如Java)允许通过对象而不是类型来调用静态方法。

BTW,与C#3.0相比,C#4.0的引入并不那么令人印象深刻。

3 个答案:

答案 0 :(得分:13)

C#4不直接支持此功能,但此博客帖子中有一个有趣的解决方法:http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx

答案 1 :(得分:9)

虽然C#不支持它,但DLR却支持它。您可以使用Dynamitey

以编程方式访问dlr调用
var staticContext = InvokeContext.CreateStatic ;

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

答案 2 :(得分:7)

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

dynamic d = new Foo();

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