个人而言感觉C#的dynamic是一个特别实用的东西,为日常开发工作中的封装,数据传递等带来了很高的可扩展性。

C#4.0中通过对数据类型后期绑定的支持,演化出了dynamic。任何直接声明为这种类型的变量,或者任何在方法参数、方法返回值、实体类属性中声明为dynamic类型的变量,都会在运行时解析成为相对应的原本数据类型,自动地视为后期绑定。

1.个人理解dynamic 类型在方法中的使用情况类似于 泛型T,你需要知道这个dynamic 类型具体是什么类型,有什么属性,从而实现封装等功能的实现。

例如:

    public class TestA
{
public string ProA { get; set; }
public string ProB { get; set; }
} public class TestB
{
public string ProA { get; set; }
public string ProC { get; set; }
}

在这种情况下,如果我们需要有两个方法。分别接受 TestA的ProA属性,  TestB的ProA属性,实现+"Str"功能,传统的开发代码如下

    public class TestAService
{ public string AddStr(TestA testA)
{
return testA.ProA + "Str";
} } public class TestBService
{
public string AddStr(TestB testB)
{
return testB.ProA + "Str";
} }

可见,代码的相似程度是极高的,由此,我们可以用dynamic实现,代码如下

    public class TestCommonService
{
public string AddStr(dynamic test)
{
return test.ProA + "Str";
} }

2.对于dynamic的另外一种用法是可以实现动态的为某个匿名类实现添加属性,并且赋值功能,如下:

        public ActionResult TestIndex()
{
dynamic testDynamic = new ExpandoObject();
testDynamic.ProA = "ProA";
TestCommonService testCommonService=new TestCommonService();
string res = testCommonService.AddStr(testDynamic);
return View();
}

dynamic的特性非常有利于我们需要对某一组需要相同特性的数据做处理时的功能实现。
3.对于DynamicObject的扩展可以尝试如下:

    public class SimpleDynamic : DynamicObject
{ public Dictionary<string, object> Properties = new Dictionary<string, object>(); //匿名类动态属性的集合 public void SetProperties(Dictionary<string, object> Properties)
{
this.Properties = Properties;
} Dictionary<string, object[]> Methods = new Dictionary<string, object[]>();
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if (!Methods.Keys.Contains(binder.Name))
{
Methods.Add(binder.Name, null);
}
if (args != null)
{
Methods[binder.Name] = args;
}
StringBuilder sbu = new StringBuilder();
foreach (var item in args)
{
sbu.Append(item);
}
result = sbu.ToString();
return true; } public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!Properties.Keys.Contains(binder.Name))
{
Properties.Add(binder.Name, value.ToString());
}
return true; }
public override bool TryGetMember(GetMemberBinder binder, out object result)
{ return Properties.TryGetValue(binder.Name, out result);
}
}
TryInvokeMember方法详见:http://msdn.microsoft.com/zh-cn/library/system.dynamic.dynamicobject.tryinvokemember.aspx

对于dynamic的研究暂时到这里,对于DynamicObject的扩展其实感觉可以应用到数据库层读取的ORM映射中来。稍后会做一下尝试。

C# 新特性 dynamic的使用及扩展的更多相关文章

  1. C# 4.0 新特性-dynamic 【转】

    前段时间看过一些关于dynamic这个C#4中的新特性,看到有些朋友认为dynamic的弊大于利,如无法使用编译器智能提示,无法在编译时做静态类型检查,性能差等等.因此在这篇文章中我将就这些问题来对d ...

  2. ES6新特性-------数组、Math和扩展操作符(续)

    三.Array Array对象增加了一些新的静态方法,Array原型上也增加了一些新方法. 1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的argumen ...

  3. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  4. C# 4.0 新特性dynamic (待学习)

    随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicO ...

  5. C# 4.0 新特性dynamic、可选参数、命名参数等

    1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 :   1 var t = new Object(); 2 t.Abc = ‘something’; 3 t.Valu ...

  6. ES6新特性3:函数的扩展

    本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...

  7. ES6新特性4:字符串的扩展

    本文摘自ECMAScript6入门,转载请注明出处. 一.ES5字符串函数 concat: 将两个或多个字符的文本组合起来,返回一个新的字符串. indexOf: 返回字符串中一个子串第一处出现的索引 ...

  8. C#新特性, dynamic, ExpandObject

    http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx using System; using System ...

  9. 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

    一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...

随机推荐

  1. 【腾讯内部干货分享】分析Dalvik字节码进行减包优化

    http://wetest.qq.com/lab/view/?id=96?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.192184.TAS ...

  2. 【转】获取手机的ipv4地址

    http://blog.csdn.net/yueqinglkong/article/details/17391051 直接贴代码: public class GetLocalIpAddress ext ...

  3. C++的优秀特性5:模版

    (转载请注明原创于潘多拉盒子) C++是强类型语言,而且恐怕是强类型语言里面类型最严格的.这意味着:1. C++变量的类型在定义时就确定了:2. 该类型在后续的生命期中不会改变.比如: int n = ...

  4. registerClassAlias()函数和getClassByAlias()函数

    flash.net 包中包含包级函数,可用于打开新的浏览器窗口,向服务器发送 URL 请求以及处理类别名. registerClassAlias()函数 public function registe ...

  5. 【转】selenium及webdriver的原理

    主要内容转自:http://blog.csdn.net/ant_ren/article/details/7968582和http://blog.csdn.net/ant_ren/article/det ...

  6. This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案

    但web启用了md5加密后 有可能出现这样的错误 This implementation is not part of the Windows Platform FIPS validated cryp ...

  7. 0c-42-ARC模式下如何兼容非ARC的类

    1.ARC模式下如何兼容非ARC的类 让程序兼容ARC和非ARC部分.转变为非ARC -fno-objc-arc 2.将MRC转换为ARC ARC也需要考虑循环引用问题:一端用strong,一端用we ...

  8. 浏览器使用ActiveX控件

    在IE中使用ActiveX控件,需要使用HTML中的标志是<OBJECT>,该标记几个重要的参数特性有:1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的入口.2.CLA ...

  9. Java_Shell多线程

    #!/bin/bash source ~/.bashrc fun(){ echo "fun is begin.timeNum:$timeNum" local timeNum=$ s ...

  10. flume监控之ganglia

    对于日志来说,我觉得监控意义不大,因为写的速度一般不会特别快,但是如果是spooldir source,里面一小时放入十几G的数据让flume解析,特别是在结合kafka或者其他框架的话,监控就显得重 ...