博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#3.0实现变异赋值(Mutantic Assignment)
阅读量:6831 次
发布时间:2019-06-26

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

话题从今天TerryLee关于MVC的一段代码说起:

protected
 
void
 Application_Start()
{
    RouteTable.Routes.MapRoute(
        
"
Default
"
,                                              
//
 Route name
        
"
{controller}/{action}/{id}
"
,                           
//
 URL with parameters
        
new
 { controller 
=
 
"
Home
"
, action 
=
 
"
Index
"
, id 
=
 
""
 }  
//
 Parameter defaults
    );
}

 

请注意new { controller = "Home", action = "Index", id = "" }参数,它是C#3.0引入的匿名类型。由于匿名类型是由编译器自动生成的类型,MapRoute在编译时并不知道其确切类型,而是在运行时通过反射解析其属性来获取信息。这种方式在语法上显得优雅简洁,它就是所谓的变异赋值(Mutantic Assignment)。

平常我们修改一个form对象的属性需要若干的赋值语句:

form.Text 
=
 “Hello World”;
form.Top 
=
 
100
;
form.Left 
=
 
200
;

 

如果C#支持变异赋值,就可以像这样一句话搞定:

form :
=
 
new
 {Text 
=
 “Hello World”, Top 
=
 
100
, Left 
=
 
200
};

这样是不是变得简洁优雅了?可惜现在C#还没有对变异赋值运算符 :=的支持。从更大的层面上,更可惜的是C#运算符重载依然有诸多限制,也没有像Boo语言支持的syntactic macro。期待在将来的C#中,我们能直接定制语言的语法,让代码更加优雅简洁。但现在,我们不得以退而求其次,只能尝试在C#3.0中用扩展方法模拟变异赋值功能:

public
 
static
 
class
 Mutant
{
    
public
 
static
 
void
  MAssign(
this
 
object
 target, 
object
 source)
    {
        
foreach
 (PropertyInfo pi1 
in
 source.GetType().GetProperties())
        {
            
if
 (
!
pi1.CanRead) 
continue
;
            PropertyInfo pi2 
=
 target.GetType().GetProperty(pi1.Name, pi1.PropertyType);
            
if
 (
null
 
==
 pi2 
||
 
!
pi2.CanWrite) 
continue
;
            pi2.SetValue(target, pi1.GetValue(source, 
null
), 
null
);
        }
    }
}

 

上面对object类定义了MAssign扩展方法,通过反射获取和设置属性值模拟变异赋值。这样,我们就可以对任意对象进行变异赋值了:

form.MAssign(
new
 {Text 
=
 “Hello World”, Top 
=
 
100
, Left 
=
 
200
});

转载地址:http://vejkl.baihongyu.com/

你可能感兴趣的文章
Qore Oracle Module 2.2 发布
查看>>
MoonScript 0.2.2 发布,基于 Lua 的脚本语言
查看>>
assertThat使用方法
查看>>
2013年11月11日工商银行笔试总结
查看>>
Qt之问题求助——当VS遇到“向Pro中添加代码”怎么办?
查看>>
使用reserve函数避免vector和string的内存重新分配
查看>>
ADO.NET(内含存储过程讲解)
查看>>
利用TreeView实现C#工具箱效果
查看>>
PyTalk : a Jabber Client un Python using xmpppy and PyQt4
查看>>
C++类构造函数初始化列表(转)
查看>>
13最佳WordPress的维护插件
查看>>
Missing Screenshot 的解决方案
查看>>
jQuery:1.5.4.3,表格变色(单击行,把当行的单选按钮(radio)设为选中状态,并应用当前样式)...
查看>>
oracle11gR2安装示例数据库
查看>>
解决ssh的"Write failed: Broken pipe"问题
查看>>
Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
查看>>
拒绝alert调试js,浏览器调试js大全(火狐firefox浏览器,谷歌chrome 浏览器,微软ie9浏览器等)...
查看>>
《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务
查看>>
NGUI:HUD Text(头顶伤害漂浮文字)
查看>>
HTML/CSS/Javascript代码在线压缩、格式化(美化)工具
查看>>