是否有更有效的方法来定义类似的公共属性

Tho*_*mas 28 c#

我有一个有近20个公共场所的课程.这些属性的共同之处在于它们都是字符串,并且它们填充了来自数据库的不同表的数据.

此外,该设置非常正常,而get是特殊的,因为我需要调用特定的方法.目前为每个房产都做了这个(见下文).

我的问题是:是否有另一种更有效的方法,这样我就不必用这种方式手工定义每个公共财产?

class myclass
{
     private string _Firstname;
     private string _Lastname;
     .....
     public string Firstname
     {
         get {
             return ModifyStringMethod(this._Firstname);
         }

         set {
             this._Firstname = value;
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,每个公共财产看起来都一样.get调用ModifyStringMethod,私有成员作为参数给出,而set只设置私有成员.

Eup*_*ric 18

您可以尝试使用T4模板自动生成代码.当你拥有简单,重复的代码模式时,它们是完美的,你并不期望某些情况与其他情况略有不同.

只需使用属性名称列表定义XML,并让T4模板为每个属性生成部分类.

  • s/hate/have /,我希望;) (2认同)
  • 我打算发布T4,但你先到了那里.T4绝对比片段更好,因为你需要添加一个更改,你只需修改和重新生成T4,****所有**你的属性都有相同的逻辑. (2认同)

Eup*_*ric 12

另一种选择类似于Dion V.的解决方案,但它利用隐式转换使属性从外部表现得像普通字符串,并且可以使用简单的自动属性.但这只有在ModifyStringMethod静态且不需要来自类外部的参数时才有效.

public struct EllipsisString
{
    private string _value;

    public string Value {get { return _value; }}

    public EllipsisString(string value)
    {
        _value = value;
    }

    // implicit conversion from string so it is possible to just assign string to the property
    public static implicit operator EllipsisString(string value)
    {
        return new EllipsisString(value);
    }

    public static implicit operator string(EllipsisString original)
    {
        return SpecialMethod(original.Value);
    }

    public override string ToString()
    {
        return SpecialMethod(Value);
    }

    private static string SpecialMethod(string value)
    {
        return value + "...";
    }
}
Run Code Online (Sandbox Code Playgroud)

用法很简单:

    private EllipsisString FirstName { get; set; }

    public void Method()
    {
        FirstName = "Thomas";
        Console.WriteLine(FirstName);
        Console.WriteLine(FirstName.Value);
    }
Run Code Online (Sandbox Code Playgroud)

  • +1如果您的属性具有特殊行为和特征,而简单字符串不提供,那么它不应该是一个简单的字符串.将该行为添加到基础类型(在Euphorics示例中为EllipsisString)并添加隐式转换,以便在需要时更轻松地处理类外部.与标记seemans关于域建模的帖子松散相关http://blog.ploeh.dk/2015/01/19/from-primitive-obsession-to-domain-modelling (3认同)

Sco*_*rod 6

PostSharp是另一种选择.

您只需在类上应用一个属性,并使用"get; set;"编写属性.句法.

PostSharp是一个.NET工具,它使开发人员能够将要执行的代码方面应用于组件,命名空间,类或方法.

具体来说,PostSharp使开发人员能够通过将属性应用于代码块来编写更少的代码,这些代码块稍后将反映该方面的代码被选中,并在所选代码块中执行.这种方法显着减少了代码库中冗余的"管道".

常见用例包括以下内容:

  • 记录

  • 安全

  • 撤销重做

  • INotifyPropertyChanged的

  • 异常处理