C# 4.0引入了一种称为“动态”的新类型。这一切听起来都不错,但是程序员会用它做什么呢?
有没有一种情况,它可以拯救世界?
发布于 2010-04-22 20:20:15
dynamic关键字是C# 4.0中新增的关键字,用于告诉编译器变量的类型可以更改,或者直到运行时才知道。可以将其视为能够与对象交互,而不必强制转换对象。
dynamic cust = GetCustomer();
cust.FirstName = "foo"; // works as expected
cust.Process(); // works as expected
cust.MissingMethod(); // No method found!
请注意,我们不需要将cust强制转换或声明为Customer类型。因为我们声明它是动态的,所以运行库接管它,然后为我们搜索并设置FirstName属性。当然,现在当您使用动态变量时,您将放弃编译器类型检查。这意味着调用cust.MissingMethod()将会编译,直到运行时才会失败。此操作的结果是一个RuntimeBinderException,因为没有在Customer类上定义MissingMethod。
上面的例子展示了在调用方法和属性时dynamic是如何工作的。另一个强大的(也是潜在危险的)特性是能够对不同类型的数据重用变量。我相信Python、Ruby和Perl程序员可以想出一百万种方法来利用这一点,但是我使用C#太久了,以至于我觉得它是“错误的”。
dynamic foo = 123;
foo = "bar";
好的,所以你很可能不会经常写像上面这样的代码。然而,有时变量重用可能会派上用场,或者清理一段肮脏的遗留代码。我经常遇到的一个简单情况是,必须不断地在小数和双精度之间进行转换。
decimal foo = GetDecimalValue();
foo = foo / 2.5; // Does not compile
foo = Math.Sqrt(foo); // Does not compile
string bar = foo.ToString("c");
第二行不能编译,因为2.5被定义为double类型,而第3行不能编译,因为Math.Sqrt需要double。显然,您所要做的就是强制转换和/或更改您的变量类型,但在某些情况下,使用dynamic可能是有意义的。
dynamic foo = GetDecimalValue(); // still returns a decimal
foo = foo / 2.5; // The runtime takes care of this for us
foo = Math.Sqrt(foo); // Again, the DLR works its magic
string bar = foo.ToString("c");
阅读更多功能:http://www.codeproject.com/KB/cs/CSharp4Features.aspx
发布于 2017-04-10 02:32:26
下面是一个使用示例:
您使用了许多具有通用属性'CreationDate‘的类:
public class Contact
{
// some properties
public DateTime CreationDate { get; set; }
}
public class Company
{
// some properties
public DateTime CreationDate { get; set; }
}
public class Opportunity
{
// some properties
public DateTime CreationDate { get; set; }
}
如果你写一个通信方法来检索'CreationDate‘属性的值,你必须使用反射:
static DateTime RetrieveValueOfCreationDate(Object item)
{
return (DateTime)item.GetType().GetProperty("CreationDate").GetValue(item);
}
有了“动态”的概念,你的代码就更优雅了:
static DateTime RetrieveValueOfCreationDate(dynamic item)
{
return item.CreationDate;
}
发布于 2010-04-22 20:16:25
COM互操作。尤其是IUnknown。它是专门为它设计的。
https://stackoverflow.com/questions/2690623
复制相似问题