如何禁止使用属性设置器

本文关键字:属性 设置 何禁止 禁止 | 更新日期: 2023-09-27 17:53:16

[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";
        }
    }
}

我不能改变我的抽象类,我想禁止在Description中使用set,如:

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

怎么做?如何实现set

如何禁止使用属性设置器

我认为你最好的选择是抛出NotSupportedException在set访问器:

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

如果你想得到一个编译错误,那是不可能的,因为你不能改变Bset方法的可及性。即使可以,有人也可以将B的实例强制转换为A类型,并在其上调用set。

有两种方法。

  1. 将setter设置为protected。

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

    这保证了90%的代码不能设置Description。但是在类A的继承者中,您仍然可以尝试设置Description。它是编译时安全的

  2. 将原来的auto-property替换为不带setter的抽象属性。然后在类B中为它编写实现。在其他类中,你可以创建backbackfield如果你想要设置/获取属性。这是一种更安全的方法,但它可能导致复制粘贴代码的冗余。

如果它是在你的抽象类我认为它不能做到。一个难看的方法是:

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

你也可以丢弃setter

中的值(接受但不使用)