C# C4.0中动力学的意图是什么?它有什么“巧妙”的用途?
正如标题所说。。。它主要用于您不知道从方法调用COM interop可能返回什么类型的实例吗?是的,COM interop可能是最常见的动态非常有用的地方。我将它与IronPython结合使用,以调用python方法,这些方法本质上是动态脚本,更简洁、更容易。这些都是它的初衷 这就是说,引入动态的总体效果是使C成为一种脚本语言,而且很有可能它将被用于许多其他用途,这让语言纯粹主义者感到恐惧。例如,MVC 3中的ViewBag属性只是ViewData集合的动态包装。它使语法看起来只是一个稍微干净的ViewBag.FirstName,而不是ViewData[FirstName],但这可能会降低清晰度:乍一看,C开发人员可能会认为前者是对某种强类型对象上属性的访问,这在没有编译器错误的情况下会给他们错误的安全感C# C4.0中动力学的意图是什么?它有什么“巧妙”的用途?,c#,dynamic,C#,Dynamic,正如标题所说。。。它主要用于您不知道从方法调用COM interop可能返回什么类型的实例吗?是的,COM interop可能是最常见的动态非常有用的地方。我将它与IronPython结合使用,以调用python方法,这些方法本质上是动态脚本,更简洁、更容易。这些都是它的初衷 这就是说,引入动态的总体效果是使C成为一种脚本语言,而且很有可能它将被用于许多其他用途,这让语言纯粹主义者感到恐惧。例如,MVC 3中的ViewBag属性只是ViewData集合的动态包装。它使语法看起来只是一个稍微干净的
我还听说过一些框架可以将JSON字符串反序列化为动态对象,因此您的.NET系统可以用javascript处理AJAX请求的方式处理动态javascript对象。对于某些人来说,它真的很酷,而对于其他人来说,它至少有点让人毛骨悚然。如果您不确切知道变量的类型,或者您想让用户指定一个在运行时加载的类并使用C反射API来加载它,那么您可以使用动态类型,这样用户就不需要从任何东西派生他们的类,但只需要定义某些方法,否则将引发异常,并从异常中打印错误以告知用户发生了什么
这样做的好处是用户键入的内容更少,因此用户出错的空间也更少。在您不知道返回类型,或者在编译时不知道对象上有哪些成员可用的情况下,它们非常有用,因此您可以将其推迟到运行时。dynamic的另一个巧妙用法是。这允许您在运行时向对象添加成员。我用它来代替字典样式的代码。 这里有一个例子,我认为它是一个很好的改进,它并没有很大的改变,但它是生活中的小事情,有不同之处:
使用dynamic可以获得的一个很酷的东西是没有访问者模式的多分派
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
}
正如您所提到的,它使与动态语言的互操作更加容易 对我来说,这通常意味着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();
从中提取示例代码,并确保看到Nice。。。我也开始使用ExpandoObjects。。。我喜欢我能把一些迟来的束缚推到物体上。我通常必须返回并添加到POCO中,或者根本不放入对象中。@Chad:它还实现了显式的IDictionary接口,这使得将现有字典对象转换为ExpandooObject非常容易。感谢链接。生活中的点点滴滴肯定会带来很大的不同;很棒,很好的例子。。。谢谢你花时间发布。不客气。然而,使用dynamic的缺点是,你放弃了类型安全。哦,这很好。谢谢分享。可能是的副本