[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
?
答案 0 :(得分:2)
我认为你最好的选择是在set accessor中抛出一个NotSupportedException:
public sealed class B : A {
public override string Description {
get {
return "Custom_Description";
}
set {
throw new NotSupportedException();
}
}
}
如果你想得到一个编译错误,相反,那是不可能的,但你不能
更改set
中B
方法的辅助功能。即使你可以,也有人可以将B
的实例投射到类型A
并在其上调用set。
答案 1 :(得分:1)
以下是两种方式。
只需让setter受到保护。
public abstract class A: IA
{
public virtual string Description { get; protected set; }
}
这可以保证90%的代码都无法设置描述。但是在A类的继承者中,您仍然可以尝试设置描述。这是编译时的安全性
在没有setter的情况下将原始auto-property替换为abstract属性。 然后在B类写入实现。在另一个类中,如果您希望能够设置/获取属性,则可以创建后备字段。这是更安全的方式,但它可以引导您使用简化的复制粘贴代码。
答案 2 :(得分:0)
如果它在你的抽象课中,我认为不能这样做。 一个丑陋的工作将是:
public sealed class B: A
{
public override string Description
{
get
{
return "Custom_Description";
}
set
{
throw new InvalidOperationException();
}
}
}
您也可以放弃(接受,但不使用它)设置器中的值