4

这是 4.0 版中新的 C# 未来,称为动态。告诉我如何在我的代码中使用它,以及这个未来如何帮助我?


相关问题:

4

4 回答 4

3

一旦你有了一个动态对象,编译器就不会担心你可能对动态对象进行的任何方法调用。调用将仅在运行时解决。在这种情况下,方法 Read() 在运行时动态调度。

更美妙的是,C# 现在让您可以灵活地指定应该如何分派动态调用。您可以实现 IDynamicObject,自己编写这些绑定器。例如,看看我是如何创建一个动态阅读器类的,它允许你在它的实例上调用你自己的方法。

public class DynamicReader : IDynamicObject
    {
        public MetaObject GetMetaObject
              (System.Linq.Expressions.Expression parameter)
        {
            return new DynamicReaderDispatch (parameter);
        }
    }

    public class DynamicReaderDispatch : MetaObject
    {
        public DynamicReaderDispatch (Expression parameter) 
                   : base(parameter, Restrictions.Empty){ }

        public override MetaObject Call(CallAction action, MetaObject[] args)
        {
            //You might implement logic for dynamic method calls. Action.name
            // will give you the method name

            Console.WriteLine("Logic to dispatch Method '{0}'", action.Name);
            return this;
        }
    }

现在,动态关键字可用于创建动态对象,就像

dynamic reader=new DynamicReader();
dynamic data=reader.Read();
于 2008-12-13T13:50:08.923 回答
3

Anders Hejlsberg 做了一个很好的 PDC 会议,名为“C# 的未来”。有一个很好的使用动态关键字的演示:

http://channel9.msdn.com/pdc2008/TL16/

于 2008-11-19T11:59:04.283 回答
3

我们在 TDD 中使用 C#“动态”关键字。

此代码无法编译,因为未实现方法“Addition”

[TestMethod()]
public void CalculatorThingAdd_2PositiveNumbers_ResultAdded()
{
    CalculatorThing myCalculator = new CalculatorThing();
    int result = 0; 
    int expcected = 3;

    // --> CalculatorThing  does not contain a definition for 'Addition'
    result = myCalculator.Addition(1, 2);

    Assert.AreEqual(result, expcected);
}

使用“动态”关键字,代码编译并且测试失败!--> TDD

在此处查看答案 https://stackoverflow.com/questions/244302/what-do-you-think-of-the-new-c-4-0-dynamic-keyword/2243818#2243818

于 2010-02-11T22:51:07.263 回答
2

其中一种用法是静态和动态语言之间的互操作。

假设您想从 silverlight 调用 JavaScript 函数:

HtmlPage.Window.Invoke("HelloWorldFunction");

如果窗口是动态的(并且正确实现),您将能够像这样使用它:

HtmlPage.Window.HelloWorldFunction();
于 2008-11-19T10:37:25.603 回答