个人而言感觉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 ...
随机推荐
-
link方式安装Eclispe插件:greenUML
用Link方式安装Eclipse插件有几点好处: (1)把自己的插件和Eclipse自带的插件分离 (2)可以通过修改link文件来决定是否加载该插件 (3)重新安装Eclipse的时候,直接拷贝自己 ...
-
WebSphere应用服务器中https 请求协议的相关注意事项(服务器使用代理上Internet)
最近遇到个需求需要web服务器应用通过https方式请求外部Internet服务器的接口,一开始本地测试时使用以下代码: String businessCode = "SH30580&quo ...
-
ios开发应用内实现多语言*切换
需求描述:应用内部有一按钮,点击切换语言(如中英文切换).说起来这个是好久以前做的一个功能点了,刚开始也是没有头绪,后来解决了发现很简单,把方法分享一下.1.原理.查看NSLocalizedStrin ...
-
WPF 引用DLL纯图像资源包类库中的图片
原文:WPF 引用DLL纯图像资源包类库中的图片 1.建立WPF应用程序 过程略. 2.创建类库项目(图片资源包) 创建图片资源类库项目MyImages,删除 ...
-
/MD、/MT、/LD( 使用 多线程版本 运行时库的C runtime library)
/MD./MT./LD(使用运行时库)(微软官网解释) Visual C++ 编译器选项 /MD./ML./MT./LD 区别 指定与你项目连接的运行期库 /MT多线程应用程序 /Mtd多线程应用程序 ...
-
信号报告-java
无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength) 信号强度即大小. 其中R位于报告第一位,共分5级,用1-5数字表示. 1-- ...
-
Linux IP和网关配置
操作环境 SuSE11/SuSE10 配置方法一<永久有效,重启不失效> 通过修改/etc/sysconfig/network/ifcfg-eth*文件直接配置,服务器重启不失效,建议使用 ...
-
怎么让挨着的两input之间没有空隙?
问题:在写选项卡的时候,用input做点击事件的切换时,两个input之间会有空隙,使用margin/padding为0或者为负数依旧如此 → 解决:我脑慢的最后才想到是空格影响的,呵呵呵.
-
Oracle EBS OM 发放订单
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
-
graph-Kruskal-algorithm
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.主要操作:1. 初始化:每个点所在集合初始化为其自身.2. 查找:查找元素所在的集合,即根节点.3. ...