类 上常见逻辑的最佳实践

Best practices for common logic on classes

我有一个很大的class,大约400万行,我认为可以用另一种方式来做下面的事情。

它是一个用于序列化消息的class,嵌套的classes 总是具有相同的结构并覆盖了ToString 和Equal 方法。有像下面这样的简单 classes 和在属性中实现这些简单 classes 的复杂 classes。

我的想法有点像扩展 class,它实现了覆盖并用它扩展了简单的 classes

例子class

[Serializable]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class ID
{
    #region Public Properties

    [XmlAttribute("ID")]
    public String Value { get; set; }

    #endregion

    #region Public Methods and Operators

    public static bool operator == (ID left, ID right)
    {
        return Equals(left, right);
    }

    public static bool operator != (ID left, ID right)
    {
        return !Equals(left, right);
    }

    public override bool Equals (object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        if (obj.GetType() != this.GetType())
        {
            return false;
        }
        return Equals((ID) obj);
    }

    public override int GetHashCode ()
    {
        return (Value != null
                    ? Value.GetHashCode()
                    : 0);
    }

    public override String ToString ()
    {
        return Value;
    }

    #endregion

    #region Methods

    protected bool Equals (ID other)
    {
        return string.Equals(Value, other.Value);
    }

    #endregion
}

我的想法

public class FieldExtension
{
    public String Value { get; set; }

    #region Public Methods and Operators

    public static bool operator == (FieldExtension left, FieldExtension right)
    {
        return Equals(left, right);
    }

    public static bool operator != (FieldExtension left, FieldExtension right)
    {
        return !Equals(left, right);
    }

    public override bool Equals (object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }
        if (ReferenceEquals(this, obj))
        {
            return true;
        }
        if (obj.GetType() != this.GetType())
        {
            return false;
        }
        return Equals((ID) obj);
    }

    public override int GetHashCode ()
    {
        return (Value != null
                    ? Value.GetHashCode()
                    : 0);
    }

    public override String ToString ()
    {
        return Value;
    }

    #endregion

    #region Methods

    protected bool Equals (ID other)
    {
        return string.Equals(Value, other.Value);
    }

    #endregion
}

public class ID: FieldExtension
{
    #region Public Properties

    [XmlAttribute("ID")]
    public String Value { get; set; }

    #endregion
}

我不知道这是否可行,我只是想问一下以前是否有人这样做过或类似的事情或其他想法,如果可行的话会节省我很多工作

提前致谢

编辑 复杂的示例 class

    [Serializable]
    [XmlType(AnonymousType = true)]
    [XmlRoot(Namespace = "", IsNullable = false)]
    public class Zählpunkt
    {
        #region Public Properties
        [XmlElement("ID")]
        public ID ID { get; set; }
        [XmlAttribute("Zählpunkt")]
        public String Value { get; set; }
        #endregion
..

你可以使基础 class FieldExtension 抽象,Value 属性 抽象:

public abstract class FieldExtension
{
    public abstract String Value { get; set; }
    ...

然后在 ID class 中覆盖 属性:

override public String Value { get; set; }

这使得基础 class 中的代码使用您在继承它的 class 中实现的值。