C#中get与set

叔到用时方恨嫂 2015-09-21 03:30:05

private string _abase;
private string _acoating;
private string _aholding;
private string _amin;

public string Abase
{
get { return _abase; }
set
{
this._abase = value;
NotifyPropertyChanged("Abase");
}
}
public string Acoating
{
get { return _acoating; }
set
{
this._acoating = value;
NotifyPropertyChanged("Acoating");
}
}
public string Aholding
{
get { return _aholding; }
set
{
this._aholding = value;
NotifyPropertyChanged("Aholding");
}
}
public string Amin
{
get { return _amin; }
set
{
this._amin = value;
NotifyPropertyChanged("Amin");
}
}

能不能把下面这访问器弄成通用的方法,通过传属性名称来实现。有时候属性太多了,在class里代码量就占了大部分,复制也花时间。

public string Abase
{
get { return _abase; }
set
{
this._abase = value;
NotifyPropertyChanged("Abase");
}
}
...全文
325 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyi_2009 2015-09-21
  • 打赏
  • 举报
回复
文本模板是一种解决方法。 新建项 - 文本模板:类名.tt

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 命名空间
{
    partial class 类名
    {
<#
// 属性名称数组。
string[] propertyNames = { "Abase" };
string fieldName;
foreach (var propertyName in propertyNames)
{
    // 属性名称长度不小于 2 个字符。
    fieldName = "_" + propertyName[0] + propertyName.Substring(1);
#>

        public string <#= propertyName #>
        {
            get { return <#= fieldName #>; }
            set
            {
                this.<#= fieldName #> = value;
                NotifyPropertyChanged("<#= propertyName #>");
            }
        }

        private string <#= fieldName #>;

<#
}
#>
    }
}
winnowc 2015-09-21
  • 打赏
  • 举报
回复
这种东西可以用 T4 模板生成代码,也可以通过 AOP 实现,AOP 分静态和动态两种,静态的是修改编译后的程序集,比如PostSharp,或者Fody之类(这里是Fody用来实现NotifyPropertyChanged的插件)。动态是运行的时候生成新的接口的实现或者子类来拦截方法调用,加入自定义逻辑。这个有老牌的 Castle.DynamicProxy,或者如果你有用 IoC / DI 框架,它们大部分都是支持拦截的。比如 Autofac的拦截功能,它给了一个写log的例子,NotifyPropertyChanged是差不多的。
durow 2015-09-21
  • 打赏
  • 举报
回复
建议看一下VS的代码段功能,自己写个代码段模板,例如我自己的就是输入propn然后Tab,就可以生成代码,只要把变量名字写一下就可以了。跟for+Tab,foreach+Tab效果类似。
wanghui0380 2015-09-21
  • 打赏
  • 举报
回复
安装coderush,然后在继承了INotifyPropertyChanged滴class里输入“ps”然后按空格你会发现惊喜地
Poopaye 2015-09-21
  • 打赏
  • 举报
回复
public enum a { base, coating, holding, min }
string[] _ = new string[4];
string Get(a p){ return _[(int)p]; }
void Set(a p, string v){ _[(int)p] = v; }
Poopaye 2015-09-21
  • 打赏
  • 举报
回复
为什么不写成一个数组?
  • 打赏
  • 举报
回复
那得用反射,这个效率比较差。如果要求苛刻可以问问Emit方面的大神 http://www.cnblogs.com/mrlen/archive/2010/06/10/1755357.html
  • 打赏
  • 举报
回复
有時候一个表字段差不多就快100个,就要写100个这玩意,这可是体力活。。。
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
c# 6.0开始有nameof关键字了……
太赞了,可以目前的项目不允许用那么高的版本
  • 打赏
  • 举报
回复
c# 6.0开始有nameof关键字了……
exception92 2015-09-21
  • 打赏
  • 举报
回复
不要想偷懒。 如果属性改变 你能知道 那个属性变了么。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧