【问题标题】:How to invoke static method in C#4.0 with dynamic type?如何在 C#4.0 中使用动态类型调用静态方法?
【发布时间】:2010-05-13 08:33:26
【问题描述】:

在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));

    }
}

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

顺便说一句,与 C#3.0 相比,C#4.0 的引入并没有那么令人印象深刻。

【问题讨论】:

    标签: c# .net dynamic c#-4.0


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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);
        

        【讨论】:

          猜你喜欢
          • 2018-10-30
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多