我有以下类层次结构:
public abstract class BaseClass : IBaseInterface
{
public int PropertyA{
get
{
return this.propertyA;
}
set
{
this.propertyA = value;
// ... some additional processing ...
}
}
}
DerivedClassB : BaseClass
{
// some other fields
}
public class ContainingClassC
{
public IBaseInterface BaseInterfaceObjectD
{
get;
set;
}
}
现在,为了访问DerivedClassB-Object的PropertyA(继承自BaseClass),我必须将对象强制转换为BaseClassA的祖先,如下所示:
// This ContainingClassC is returned from a static, enum-like class:
// containingObject.PropertyA is DerivedClassB by default.
ContainingClassC containingObject = new ContainingClassC();
((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;
有没有办法可以重组这些类来取消演员阵容?这段代码是图书馆的一部分,我的同事希望我摆脱演员阵容。
目标是简单地写containingObject.BaseInterfaceObjectD.PropertyA = 42
。
答案 0 :(得分:0)
首先,在行((IBaseInterface)containingObject.BaseInterfaceObjectD).PropertyA = 42;
中,您将成员转换为声明它的相同类型,因此转换实际上不会执行任何操作。
为了能够访问派生类中的PropertyA - 因为要将其转换为接口 - 必须在接口中声明该属性,然后在BaseClass中实现。
public interface IBaseInterface{
int PropertyA{get;set;}
}
public abstract class BaseClass : IBaseInterface{
public int PropertyA{
get{ return this.propertyA;}
set {this.propertyA = value;}
}
}
只要接口正确实现,ProprtyA应该在基类,派生类或其中任何一个都可用于接口类型。
如果只是在IntelliSense中没有显示该属性的问题,则可能是您的设置有问题。查看选项 - >文本编辑器 - > C#并确保您已启用IntelliSense,而不是设置为隐藏任何标记。