返回首页


这听起来像一个笑话,但的确有一类称为ExpandoObject。当我第一次听到它,我认为这是一场闹剧,但它实际上是非常有用的。 [让我序言中说,我不一定会在生产代码中使用这个类,因为它有可能成为一个维护的噩梦,但它的一个好地方,了解动态对象。ExpandoObject是一个DyanamicObject DynamicObject本质上是一个对象,接受和经纪公司的成员调用(方法和属性)下的动态范围内(有点像代理)。 ExpandoObject是一个非常具体实施的DynamicObject的类型,它定义和覆盖对象(如一个实际的方法调用或属性集),可以执行的具体操作。然后,它在运行时创建的,可以执行的属性。可以找到完整的文档的ExpandoObject
那么它意味着在运行时创建的属性?随着ExpandoObject,你可以做这样的事情:
在此代码示例,我创建了一个ExpandoObject实例,并分配到动态的变量前。标记为动态的变量编译时检查,但运行时解决。
ex.Name是我创建的第一个属性。我将它分配给它一个字符串值类型的字符串。即使我从来没有定义的属性,这将编译罚款代码>名称;???我打算让ExpandoObject创建对我来说。
在大多数情况下,ex.Name会在运行时失败,因为没有运行时实现。换句话说,如果你要运行下面的代码,你会得到一个错误:{C}
{A1}
抛出一个例外是因??>名称,代码??即使编译,在运行时不存在。
您还可以定义上ExpandoObject的方法。

// We can also create functions (this action takes no parameters).

  ex.PrintToConsole = (Action)(() => Console.WriteLine("some function")); 

  // Creating methods that take a parameter.

  ex.PrintWithParam = (Action<string>)((string s) => Console.WriteLine(s)); 



  // Creating methods that take a parameter and return a value.

  ex.MethodWithReturn = (Func<int, int>)((int i) => i * i); 

  ex.PrintWithParam("hello");

  Console.WriteLine(ex.MethodWithReturn(9));

在上面的代码示例中,我定义的方法PrintToConsole是一个委托类型的行动(不带任何参数并返回void);您还可以创建类型Actionlt代表; GT; Funclt; GT; ... ...这定义动态方法是一个非常巧妙的方法。
那么这所有的工作? ExpandoObject知道如何拦截方法调用并定义属性?好了,正如我上面提到的,ExpandoObject是一个DynamicObject(它实际上是一个IDynamicMetaObjectProvider,但DynamicObject实现IDynamicMetaObjectProvider)。有DynamicObject许多重写的方法,但我们的目的,三个最重要的是:TryGetmember (,,.), TrySetMember (???, TryInvokeMember (???.当在子类中中实现,DLR将调用相应的在运行过程中的方法,所以,例如,当一个属性是一个ExpandoObject实例上设置了DLR调用TrySetMember(一些参数)ExpandoObject然后ExpandoObject的东西,并返回真或假;如果调用成功(总是),否则返回false,如果返回false,你会得到上面的错误(对象不包含定义等等等等),我写了我自己ExpandoObject的荒谬简单的用于演示目的的实施。
{A2}
不多吧,真的。当一个setter被调用时,将执行TrySetMember。知道粘结剂参数设置的属性的名称??所以如果你有ex.MyProp ="文本??/代码,binder.Name财产将被设置??代码> MyProp??在我而言,我作为重点使用到一个Hashtable??值是第二个参数。现在,当一个get成员是执行,TryGetMember将执行类似的参数的被执行的财产和结果,你必须在退出该方法之前设置的名称。其结果是字面上的操作的结果。所以,如果我有所谓MyProp属性值???代码>文字,???当我去到打印,在屏幕上我看到吗???代码>文字,???因为那是什么我在存储字典时属性设置。
TryInvokeMember更有趣一点。当一个方法是一个动态的对象(如我的第一个代码示例当我定义的代表)执行的,这就是所谓的。所以,如果我不喜欢ex.Something()的东西,TryInvokeMember将执行所有设置适当的参数。由于行动,Actionlt; GT,和Funclt; GT;所有委托类型,我从字典值转换到委托然后动态地调用所提供的参数。
在代码中使用MySimpleExpandoObject的。
{A3}
{A4}

回答

评论会员:优素福 时间:2012/01/26
。NET Framework中您将需要使用正确的版本,你开发的应用程序。 NET Framework中,您可以自由下载,从MS网站.
评论会员:游客 时间:2012/01/26
对于硬件的要求,请参阅{A5}](NET2.0)
。dan4xt
评论会员:游客 时间:2012/01/26
在任何机器上运行的应用程序,您需要安装净。在该系统的框架。同时创建该应用程序的安装,这将产生-requites前,你必须在目标系统上安装