Learn_Dynamic
首先看一下Dynamic的定义
Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。 因此,您不必考虑对象是从 COM API、从动态语言(例如 IronPython)、从 HTML 文档对象模型 (DOM)、从反射还是从程序中的其他位置获取自己的值。 但是,如果代码无效,则在运行时会捕获到错误。
先来看一个简单的应用
dynamic d1 = ;
dynamic d2 = "我是动态类型";
Console.WriteLine(d1+d2);

下面来看看Dynamic和反射的不同之处,如下:
我们可以看到Dynamic可以一定程度的简化反射调用的步骤,并且Dynamic会自动加载,也就是我们做的少,那么编译器就做的多.
但编译器会优化Dynamic类型,所以说Dynamic在一定程度上优于Dynamic
Person p = new Person();
Type t = p.GetType();
int i1 = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, p, new object[] { , });
Console.WriteLine("通过反射来调用Add方法:\n"+i1);
dynamic dy = new Person();
i1=dy.Add(, );
Console.WriteLine("通过Dynamic来调用Add方法:\n" + i1);
Console.Read();

通过Dynamic动态创建对象
class MyDynamic : DynamicObject
{
private Dictionary<string, object> _Dynamic = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result)
{
bool re = false;
if (_Dynamic.ContainsKey(binder.Name))
{
result = _Dynamic[binder.Name];
re = true;
}
else
result = "对不起属性不存在哦!!!";
return re;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_Dynamic[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
return base.TryInvokeMember(binder, args, out result);
}
}
static void Main(string[] args)
{
dynamic d = new MyDynamic();
d.name = "";
Func<int, int, int> dd = (d1, d2) => { return d1 + d2; };
d.add = dd;
Console.WriteLine(d.add(, ));
Console.WriteLine(d.name);
Console.Read();
}

Learn_Dynamic的更多相关文章
随机推荐
- 面试常考的数据结构Java实现
1.线性表 2.线性链表 3.栈 4.队列 5.串 6.数组 7.广义表 8.树和二叉树 的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 二叉树的性质: :在二叉树的第 i 层上至多有2 ...
- Git教程(4)常用小技巧之标签
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated). 一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用. 然而,附注标签是存储在 Git ...
- bzoj题解
bzoj1012 线段树水题 bzoj1207 LIS水题 bzoj2190 挡住,即 bzoj1601 已被删除的水题? bzoj1607 线段树细节题,搞清楚特判即可 bzoj1008 快速幂妥妥 ...
- POJ 1269 (直线相交) Intersecting Lines
水题,以前总结的模板还是很好用的. #include <cstdio> #include <cmath> using namespace std; ; int dcmp(dou ...
- POJ 3678 Katu Puzzle (2-SAT,常规)
题意:给出n个点,每个点上有一个数字可以0或1,然后给出m条限制,要求a和b两个点上的数字满足 a op b = c,op和c都是给定.问是否能够有一组解满足所有限制?(即点上的数字是0是1由你决定) ...
- Java [leetcode 35]Search Insert Position
题目描述: Given a sorted array and a target value, return the index if the target is found. If not, retu ...
- Eclipse中出现Select at least one project解决办法
今天遇到个问这个问题的,顺便帮解决了,是在导入工程的时候出现的,这是因为有同名的工程的,进入windows->show view->project explorer 这里找出来删掉再导入工 ...
- Entity Framework中查看生成的SQL语句
Entity Framework 4.0 中是这样的,高版本的跟这个有些差异,不太一样,貌似已经到7了 using (Entities entities = new Entities()) { var ...
- C# 中的数组(array)
原文 C# 中的数组(array) 特性 数组是一个无序的元素序列.数组元素存储在一个连续性的内存块中,并可使用一个整数索引来访问. C# 声明数组变量时,数组的大小不是声明的一部分.这点与C/C++ ...
- HDU 1255 覆盖的面积 线段树+扫描线
同 POJ1151 这次是两次 #include <iostream> #include <algorithm> #include <cstdio> #includ ...