博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2014/5/29 记录
阅读量:5107 次
发布时间:2019-06-13

本文共 4418 字,大约阅读时间需要 14 分钟。

1. ExpandoObject   扩展对象,运行时动态添加和移除的成员;  要用dynamic 声明,可以在编译时跳过检查,只打包信息, 在运行时在查查找并执行; 有没有javacript Prototype 的感觉?

http://msdn.microsoft.com/zh-cn/library/system.dynamic.expandoobject.aspx

2.DynamicObject 一个基类, 派生类可以override TryGetMember, TrySetMember, TryInvokeMember/TryInvoke 等方法; 

http://msdn.microsoft.com/zh-cn/library/system.dynamic.dynamicobject(v=vs.110).aspx

其中关于TryInvoke可以细细品味 , 如下:

public class DynamicNumber : DynamicObject{    // The inner dictionary to store field names and values.    Dictionary
dictionary = new Dictionary
(); // Get the property value. public override bool TryGetMember( GetMemberBinder binder, out object result) { return dictionary.TryGetValue(binder.Name, out result); } // Set the property value. public override bool TrySetMember( SetMemberBinder binder, object value) { dictionary[binder.Name] = value; return true; } // Initializing properties with arguments' values. public override bool TryInvoke( InvokeBinder binder, object[] args, out object result) { // The invoke operation in this case takes two arguments. // The first one is integer and the second one is string. if ((args.Length == 2) && (args[0].GetType() == typeof(int)) && (args[1].GetType() == typeof(String))) { // If the property already exists, // its value is changed. // Otherwise, a new property is created. if (dictionary.ContainsKey("Numeric")) dictionary["Numeric"] = args[0]; else dictionary.Add("Numeric", args[0]); if (dictionary.ContainsKey("Textual")) dictionary["Textual"] = args[1]; else dictionary.Add("Textual", args[1]); result = true; return true; } else { // If the number of arguments is wrong, // or if arguments are of the wrong type, // the method returns false. result = false; return false; } }}class Program{ static void Test(string[] args) { // Creating a dynamic object. dynamic number = new DynamicNumber(); // Adding and initializing properties. // The TrySetMember method is called. number.Numeric = 1; number.Textual = "One"; // Printing out the result. // The TryGetMember method is called. Console.WriteLine(number.Numeric + " " + number.Textual); // Invoking an object. // The TryInvoke method is called. number(2, "Two"); Console.WriteLine(number.Numeric + " " + number.Textual); // The following statement produces a run-time exception // because in this example the method invocation // expects two arguments. // number(0); }}// This code example produces the following output:// 1 One// 2 Two
View Code(TryInvoke)

3. CallSite & CallSiteBinder

http://msdn.microsoft.com/zh-cn/library/dd402827.aspx

http://msdn.microsoft.com/zh-cn/library/dd728234(v=VS.95)

5. dynamic 反编译后会是什么?

 static void Main() 

        { 
            dynamic d = 5; 
            d.ToString(); 
            d.ToString(); 
        } 

internal class Program {     // Methods     private static void Main()     {         object d = 5;         if (
o__SiteContainer0.<>p__Site1 == null) {
o__SiteContainer0.<>p__Site1 = CallSite
>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "ToString", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) })); }
o__SiteContainer0.<>p__Site1.Target(
o__SiteContainer0.<>p__Site1, d); if (
o__SiteContainer0.<>p__Site2 == null) {
o__SiteContainer0.<>p__Site2 = CallSite
>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "ToString", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) })); }
o__SiteContainer0.<>p__Site2.Target(
o__SiteContainer0.<>p__Site2, d); } // Nested Types [CompilerGenerated] private static class
o__SiteContainer0 { // Fields public static CallSite
> <>p__Site1; public static CallSite
> <>p__Site2; } }
View Code

 

转载于:https://www.cnblogs.com/Gabriel/p/3759187.html

你可能感兴趣的文章
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Groovy中那些神奇注解之ToString
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
我最宏大的个人愿望
查看>>
比赛总结一
查看>>
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
C++函数基础知识
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>
报表服务框架:WEB前端UI
查看>>
5.9UDP客户端服务器-基于OK6410
查看>>
java自学基础、项目实战网站推荐
查看>>