Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用动态类型调用C#4.0中的静态方法?_C#_.net_Dynamic_C# 4.0 - Fatal编程技术网

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

如何用动态类型调用C#4.0中的静态方法?,c#,.net,dynamic,c#-4.0,C#,.net,Dynamic,C# 4.0,在C#4.0中,我们有动态类型,但是如何调用动态类型对象的静态方法呢 下面的代码将在运行时生成异常。dynamic对象来自C#class,但它可以是通过DLR来自其他语言的对象。重点不是如何调用静态方法,而是如何调用无法在C#代码中创建的动态对象的静态方法 总之,dynamic是为连接C#和其他编程语言而发明的。还有一些其他语言(如Java)允许通过对象而不是类型调用静态方法 顺便说一句,与C#3.0相比,C#4.0的引入并没有那么令人印象深刻。这不是C#4直接支持的,但在这篇博文中有一个有趣的

在C#4.0中,我们有动态类型,但是如何调用动态类型对象的静态方法呢

下面的代码将在运行时生成异常。dynamic对象来自C#class,但它可以是通过DLR来自其他语言的对象。重点不是如何调用静态方法,而是如何调用无法在C#代码中创建的动态对象的静态方法

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


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

这不是C#4直接支持的,但在这篇博文中有一个有趣的解决方法:

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

dynamic d = new Foo();

var sum = (int)d.GetType()
                .GetMethod("Sum")
                .Invoke(d, new object[] { 1, 3 });
Console.WriteLine(sum);
虽然C#不支持,但DLR支持。您可以通过以下方式以编程方式访问dlr调用:

dynamic d = new Foo();

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

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