如何禁止使用属性设置器?

时间:2016-06-30 10:41:02

标签: c#

[KnownType(typeof(B))]
public abstract class A: IA //  string Description { get; }
{
      [DataMember(Name = "description")]
      public virtual string Description { get; set; }
}

public sealed class B: A
{
    public override string Description
    {
        get
        {
            return "Custom_Description";
        }
    }
}

我无法更改我的抽象类,我想禁止在set中使用Description,例如:

B b = new B();
b.Description = "description";

怎么做?我该如何实施set

3 个答案:

答案 0 :(得分:2)

我认为你最好的选择是在set accessor中抛出一个NotSupportedException:

public sealed class B : A {
    public override string Description {
        get {
            return "Custom_Description";
        }
        set {
            throw new NotSupportedException();
        }
    }
}

如果你想得到一个编译错误,相反,那是不可能的,但你不能 更改setB方法的辅助功能。即使你可以,也有人可以将B的实例投射到类型A并在其上调用set。

答案 1 :(得分:1)

以下是两种方式。

  1. 只需让setter受到保护。

    public abstract class A: IA
    {
         public virtual string Description { get; protected set; }
    }
    

    这可以保证90%的代码都无法设置描述。但是在A类的继承者中,您仍然可以尝试设置描述。这是编译时的安全性

  2. 在没有setter的情况下将原始auto-property替换为abstract属性。 然后在B类写入实现。在另一个类中,如果您希望能够设置/获取属性,则可以创建后备字段。这是更安全的方式,但它可以引导您使用简化的复制粘贴代码。

答案 2 :(得分:0)

如果它在你的抽象课中,我认为不能这样做。 一个丑陋的工作将是:

public sealed class B: A
{
    public override string Description
    {
        get
        {
            return "Custom_Description";
        }
        set
        {
           throw new InvalidOperationException();
        }
    }
}

您也可以放弃(接受,但不使用它)设置器中的值