如何禁止使用属性设置器
本文关键字:属性 设置 何禁止 禁止 | 更新日期: 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();
}
}
}
如果你想得到一个编译错误,那是不可能的,因为你不能改变B
中set
方法的可及性。即使可以,有人也可以将B
的实例强制转换为A
类型,并在其上调用set。
有两种方法。
-
将setter设置为protected。
public abstract class A: IA { public virtual string Description { get; protected set; } }
这保证了90%的代码不能设置Description。但是在类A的继承者中,您仍然可以尝试设置Description。它是编译时安全的
-
将原来的auto-property替换为不带setter的抽象属性。然后在类B中为它编写实现。在其他类中,你可以创建backbackfield如果你想要设置/获取属性。这是一种更安全的方法,但它可能导致复制粘贴代码的冗余。
如果它是在你的抽象类我认为它不能做到。一个难看的方法是:
public sealed class B: A
{
public override string Description
{
get
{
return "Custom_Description";
}
set
{
throw new InvalidOperationException();
}
}
}
你也可以丢弃setter