C# 新特性 dynamic的使用及扩展
个人而言感觉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的使用及扩展的更多相关文章
- C# 4.0 新特性-dynamic 【转】
前段时间看过一些关于dynamic这个C#4中的新特性,看到有些朋友认为dynamic的弊大于利,如无法使用编译器智能提示,无法在编译时做静态类型检查,性能差等等.因此在这篇文章中我将就这些问题来对d ...
- ES6新特性-------数组、Math和扩展操作符(续)
三.Array Array对象增加了一些新的静态方法,Array原型上也增加了一些新方法. 1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的argumen ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- C# 4.0 新特性dynamic (待学习)
随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicO ...
- C# 4.0 新特性dynamic、可选参数、命名参数等
1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 : 1 var t = new Object(); 2 t.Abc = ‘something’; 3 t.Valu ...
- ES6新特性3:函数的扩展
本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...
- ES6新特性4:字符串的扩展
本文摘自ECMAScript6入门,转载请注明出处. 一.ES5字符串函数 concat: 将两个或多个字符的文本组合起来,返回一个新的字符串. indexOf: 返回字符串中一个子串第一处出现的索引 ...
- C#新特性, dynamic, ExpandObject
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx using System; using System ...
- 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用
一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...
随机推荐
- (2)html文本格式化 解说
- C#委托的介绍(delegate、Action、Func、predicate)(转)
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Deleg ...
- 用java写一个web服务器
一.超文本传输协议 Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答.HTTP协议使用可靠的T ...
- 【C#】工具类-FTP操作封装类FTPHelper
转载:http://blog.csdn.net/gdjlc/article/details/11968477 using System; using System.Collections.Generi ...
- IAR EWARM Argument variables $PROJ_DIR$ $TOOLKIT_DIR$
在IAR中的help中输入argument variables时会找到这样的一个列表: Argument variables On many of the pages in the Options d ...
- linux C(hello world) 解方程
- 【Python笔记】图片处理库PIL的源代码安装步骤
前段时间项目须要对某些图片打水印,用到Python的PIL库,本文以Imaging-1.1.7为例,记录PIL库的源代码编译/安装步骤. PIL全称Python Image Library.它支持多种 ...
- 设备\Device\Harddisk1\DR1 有一个不对的区块
近期遇到一个windows上的Oracle DB system表空间有问题.然后第一个反应就是查看windows的日志查看器,确实发现了报错: 设备\Device\Harddisk1\DR1 有一个不 ...
- Android微信SDK API 调用教程【转】
原文:http://blog.csdn.net/worker90/article/details/8211451 最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官 ...
- 【JavsScript】转载---如何成为优秀的前端
题记 做好前端 关于离职 如何成为优秀的前端 书籍推荐 博客推荐 源码阅读 去面试 14年计划 招聘信息 题记 四月前,低迷.失志踌躇不前形容自己再好不过,中途来了一次彻底的醒悟,于是我发现自己变得勤 ...