C#4.0中动态的目的是什么?什么是“整洁”的用途?

时间:2011-04-10 14:16:00

标签: c# dynamic

正如标题所述......主要是因为你不确切知道从方法调用返回什么类型的实例(可能是COM互操作)?

6 个答案:

答案 0 :(得分:2)

这是一个我认为是一个很好的改进的例子,它不会改变很多,但是生活中的小事情会产生影响:)

http://weblogs.asp.net/gunnarpeipman/archive/2010/07/27/asp-net-mvc-3-new-viewmodel-is-dynamic-viewdata.aspx

答案 1 :(得分:1)

是的,COM互操作可能是动态非常有用的最常见的地方。我已经将它与IronPython结合使用来调用python方法(本质上是动态脚本)更清晰,更容易。这些是它的目的。

也就是说,引入动态的总体效果是使C#成为一种脚本语言,并且很有可能它会被用于其他许多目的(很多恐怖的语言纯粹主义者)。例如,MVC 3中的ViewBag属性只是ViewData集合的动态包装器。它使语法看起来有点“干净”(ViewBag.FirstName而不是ViewData["FirstName"]),但可能会明显降低成本:一眼就看出,C#开发人员可能会认为前者是访问某种类型的强类型对象上的属性,当没有编译器错误时会给它们一种错误的安全感。

我还听说过可以将JSON字符串反序列化为动态对象的框架,因此您的.NET系统可以处理来自AJAX请求的动态javascript对象,就像javascript处理它们一样。这对某些人来说真的很酷,至少对其他人有点令人毛骨悚然。

答案 2 :(得分:1)

如果您不确切知道变量的类型,或者您希望允许用户指定要在运行时加载的类并使用C#reflection API加载它,那么您可以使用动态类型以便用户不需要他们的类来从任何东西派生,但只需要定义某些方法(如果没有,则会抛出异常并从异常中打印出错误以告诉用户发生了什么)。

这样做的好处是用户输入的次数会减少,因此用户错误的空间也会减少。

答案 3 :(得分:1)

它们在您不知道返回类型的情况下非常有用,或者您在编译时不知道对象上可用的成员,因此您可以将其推迟到运行时。动态的另一个巧妙用途是ExpandoObject。这允许您在运行时将成员添加到对象。我用它来替换{​​{1}}样式代码。

答案 4 :(得分:1)

动态获得的“酷”之一是没有访客模式的多次调度。

public class Fruit {}
public class Apple : Fruit {}

public class GrannySmith : Apple {}


public class FruitSalad
{
    public void Mix(Apple apple) {
        Console.WriteLine("mixing a apple");
    }

    public void Mix(GrannySmith apple) {
        Console.WriteLine("mixing a Granny-Smith apple");
    }

    public void Mix(Fruit fruit) {
        Console.WriteLine("unknown fruit, can't mix!");
    }

}

    public static void Main(string[] args)
    {
        var salad = new FruitSalad();

        Fruit fruit = new Apple();
        salad.Mix(fruit); // unknown fruit, can't mix 
                          // (can't resolve onm the type of parameter)

        dynamic fruit2 = new Apple();
        salad.Mix(fruit2); // mixing a apple
                           // with dynamic, the parameter's resolution 
                           // is deferred to runtime, so now we know it's an apple

    }

答案 5 :(得分:1)

正如您所提到的,它可以更轻松地与动态语言进行互操作。

对我来说,这通常意味着javascript。我最喜欢的用途之一就是在服务器上使用JSON而不定义DTO - 这也使LINQ能够实现JSON:

JsonObject body;
string[] favoriteToys =
  (from child in (JsonValue)body.AsDynamic().Children
   where child.Value.AsDynamic().Name.ReadAs<string>(string.Empty).StartsWith("J")
   select child.Value.AsDynamic().BestToy.ReadAs<string>("No favorite toy"))
       .ToArray();

(示例代码取自“Okay, WCF, we can be friends now”,请务必看到“WCF support for jQuery on wcf.codeplex.com”)