代码之美~Func让构造方法为属性赋值更灵活

有时我们习惯上把基类中属性的赋值权限放在它的构造方法上,这样给我们感觉更直接,也更安全,这也体现了面向对象的封装性,即将不想开放的东西隐藏到类内部,当进行.net3.5时代后,属性的定义显得更加美观和合理,看下面是几种具有不同读写权限的属性。

 1         /// <summary>
 2         /// 完全公开
 3         /// </summary>
 4         public string ErrorMessage { get; set; }
 5         /// <summary>
 6         /// 读完全公开,但写操作约束在了子类
 7         /// </summary>
 8         public string ErrorMessage { get; protected set; }
 9         /// <summary>
10         /// 读完全公开,但写操作只能在本类中进行
11         /// </summary>
12         public string ErrorMessage { get; private set; }
13         /// <summary>
14         /// 只读属性,只能返回消息,不能赋值
15         /// </summary>
16         public string ErrorMessage { get; }

上面的知识只是为本文做一个铺垫,本文主要说在构造方法中使用Func委托,让属性赋值更灵活。更多Func的资料请看我的这篇文章

实例说明:一个人类,一个中国人类,在中国人类中有个显示姓名的属性,它由构造方法为它赋值,而对于中国人和美国人她们姓名的组成是不一样的,所以将公用的东西提取到一个基类

Person中,而中国人相关的东西放在ChinaPeople中,它根据有自己的构造方法,可以有自己产生姓名的方式,男人一种,女人一种,这可以根据一个Gander枚举来实现切换。

Person代码如下:

 1   public abstract class Person
 2     {
 3         #region Fields
 4         private string _errorMessage;
 5         private Func<string> _func;
 6         #endregion
 7
 8         #region Constructors
 9
10         protected Person()
11         { }
12
13         protected Person(Func<string> displayNameAccessor)
14         {
15             this._func = displayNameAccessor;
16         }
17
18         protected Person(string displayName)
19             : this(() => displayName)
20         { }
21         #endregion
22
23         #region Methods & Properies
24         public string DisplayName
25         {
26             get
27             {
28                 return this._func();
29             }
30         }
31         #endregion
32     }

 而对于中国人来说,他们完全可以根据自己国家的标准和风俗去规定自己的姓名显示方法,如张三先生,李四小姐等,所以ChinaPerson类的内容如下:

 1   public class ChinaPerson : Person
 2     {
 3         public ChinaPerson(string name, Gander gander)
 4             : base(() => FormatName(name, gander))
 5         { }
 6         public ChinaPerson(string name)
 7             : base(name)
 8         { }
 9         public ChinaPerson()
10         { }
11         /// <summary>
12         /// 中国人类型,格式姓名
13         /// </summary>
14         /// <param name="name"></param>
15         /// <param name="gander"></param>
16         /// <returns></returns>
17         public static string FormatName(string name, Gander gander)
18         {
19             string res = null;
20             switch (gander)
21             {
22                 case Gander.Male:
23                     res = string.Format("中国人姓名是:{0}先生", name);
24                     break;
25                 case Gander.FeMale:
26                     string.Format("中国人姓名是:{0}女士", name);
27                     break;
28             }
29             return res;
30         }
31     }

调用时,代码如下:

1             ChinaPerson cm = new ChinaPerson("张三", Gander.Male);
2             Console.WriteLine(cm.DisplayName);
3
4             cm = new ChinaPerson("张三");
5             Console.WriteLine(cm.DisplayName);

结果为:

而在调用它的时间,就像我们需要的方式显示了,直接输入姓名就显示姓名,如果输入的是姓名和性别,就会根据性别的类型,去调用它的模板,这一切都是灵活使用Func委托的功劳,

在此,感谢一下Func,呵呵。辛苦了。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:代码之美~Func让构造方法为属性赋值更灵活,如需转载请自行联系原博主。

时间: 2024-09-15 03:11:01

代码之美~Func让构造方法为属性赋值更灵活的相关文章

代码之美~Lambda带给我们的不只是简洁

.net进行3.5时代后,各种新的语言特性相继而来,今天主要说的是Lambda表达式带给我们的是什么? 说lambda肯定离不开匿名方法,说匿名方法肯定离不开委托,其实,你可以把这三个东西看作是一个事物的不同发展阶段,他们也标志着.net framework的发展史: .net frameworks 1.x 委托 .net frameworks 2.x 匿名方法来实现委托 .net frameworks 3.x lambda表达式来实现委托 委托,delegate你不要简单的说,"把方法当方法的

优化代码:网页技术CSS的font属性的缩写的技巧

css|技巧|网页|优化 优化代码:网页技术CSS的font属性的缩写的技巧,缩写有利于减少代码,优化CSS,使之更加合理. css font属性是用来控制文字字体.颜色.大小等.而font的属性有多种,在通常情况下,我们用缩写的办法将多种属性概括在一句css代码中.这样极大的减小了代码,优化css文件. 我们常用的font属性有下面这六种: font-style设定斜体 如:font-style: italic;font-weight设定文字粗细 如:font-weight: bold;fon

struts2-这段代码的错误在哪里,id属性的值为空,但是控制台能输出所有的value值,求大神解答??

问题描述 这段代码的错误在哪里,id属性的值为空,但是控制台能输出所有的value值,求大神解答?? <s:form action=""deleteMessageAction"" method=""post""> <table align=""center"" width=""40%"" border=""5&

xml解析-java代码怎么读取xml中的各个属性值对应的内容

问题描述 java代码怎么读取xml中的各个属性值对应的内容 java代码怎么读取xml中的各个属性值对应的内容.比如得到连接Sql Server数据库的localhost sqlname username password

用java代码对android view控件设置属性

问题描述 用java代码对android view控件设置属性 用java代码设置控件文本颜色 texeview.settextcolor(colorstatelist color) 请问传参传的对象怎么构建 用来描述颜色属性 解决方案 用TextView.setTextColor(int color),传入Color.BLUE等,或者直接传 int color = 0xFFFFFFFF; TextView.setTextColor(color). 这里color的ARGB自己定义 解决方案二:

一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo

在<一句代码实现批量数据绑定>中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定.由于里面频繁涉及对属性的反射--通过反射从实体对象中获取某个属性值:通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式.为了提升性能,我通过IL Emit的方式创建了一个PropertyAccessor组件,以实现高效的属性操作.如果你看了我在文中给出的三种属性操作性能的测试结果,相信会对PropertyAccessor的作用有深刻的印象.[源代码从这里下载] 目录: 一.Prop

晚绑定场景下对象属性赋值和取值可以不需要Pro“.NET技术”pertyInfo

在<一句代码实现批量数据绑定>中,我通过界面控件ID与作为数据源的实体属性名之间的映射实现了批量数据绑定.由于里面频繁涉及对属性的反射--通过反射从实体对象中获取某个属性值:通过反射为控件的某个属性赋值,所以这不是一种高效的操作方式.为了提升性能,我通过IL Emit的方式创建了一个PropertyAccessor组件,以实现高效的属性操作.如果你看了我在文中给出的三种属性操作性能的测试结果,相信会对PropertyAccessor的作用有深刻的印象.[源代码从这里下载] 目录: 一.Prop

网页中通过param name方式给ActiveX控件的属性赋值示例

通过param name方式给ActiveX控件的属性赋值的想法还是不错的感兴趣的朋友可以看下具体的实现,希望对大家有所帮助     复制代码 代码如下: <HTML> <HEAD> <TITLE>Test ActiveX</TITLE> <OBJECT ID="TestCtrl" NAME="<span style="font-family:Arial,Helvetica,sans-serif"

c#程序问题-c#编程对象属性赋值问题!

问题描述 c#编程对象属性赋值问题! label6.Text = "A"; label7.Text = "B"; label8.Text = "C"; label9.Text = "D"; label10.Text = "E"; label11.Text = "A"; label12.Text = "B"; label13.Text = "C";