Mor*_*eng 13 .net c# 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));
}
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,动态是发明桥接C#和其他编程语言.还有一些其他语言(例如Java)允许通过对象而不是类型来调用静态方法.
顺便说一下,与C#3.0相比,C#4.0的引入并不那么令人印象深刻.
Jul*_*ain 14
这不是C#4直接支持的,但是这篇博文中有一个有趣的解决方法:http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static- members.aspx
虽然C#不支持它,但DLR却支持它.您可以使用Dynamitey以编程方式访问dlr调用
var staticContext = InvokeContext.CreateStatic ;
Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3));
Run Code Online (Sandbox Code Playgroud)
一种可能的解决方法是使用反射.
dynamic d = new Foo();
var sum = (int)d.GetType()
.GetMethod("Sum")
.Invoke(d, new object[] { 1, 3 });
Console.WriteLine(sum);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9631 次 |
| 最近记录: |