只有当父类是特定的时,属性才可用
本文关键字:属性 父类 | 更新日期: 2023-09-27 18:28:54
这可能很简单,但我是C#的新手。某些类别:
public class Extension {
Public string Name;
Public List<View> Views;
}
public class Module : Extension {
// ...
}
public class Component : Extension {
// ...
}
public class View {
// ...
}
和一个集合:
List<Extensions> MyExtensions = new List<Extensions>() {
new Component {
Name = "Component",
Views = new List<View>() {
}
}
new Module {
Name = "Module",
Views = new List<View>() {
}
}
}
如何在视图中添加属性FOO仅当其父对象是组件时可用?
由于您的类现在已经设置好了,如果不使用一些超级黑客代码,您将无法获得该结果。相反,我认为你应该把你的类改成这样:
public abstract class View
{
// ...
}
public class ModuleView : View
{
}
public class ComponentView : View
{
public object Foo; //Substitute object with whatever type Foo is
}
public abstract class Extension
{
public string Name;
public abstract List<View> Views { get; set; }
}
public class Module : Extension
{
public override List<View> Views
{
get
{
ModuleView moduleViewA = new ModuleView();
ModuleView moduleViewB = new ModuleView();
//Continue building whatever ModuleView objects you need...
return new List<View>()
{
moduleViewA,
moduleViewB,
//...plus all other ModuleView objects you built
};
}
set
{
Views = value;
}
}
}
public class Component : Extension
{
public override List<View> Views
{
get
{
ComponentView compViewA = new ComponentView();
ComponentView compViewB = new ComponentView();
//Continue building whatever ComponentView objects you need...
return new List<View>()
{
compViewA,
compViewB,
//...plus all other ComponentView objects you built
};
}
set
{
Views = value;
}
}
}
这保证了只有Component
对象能够看到字段Foo
。
请求的目的非常模糊,但如果Component
与View
在同一程序集中定义,则可以选择使属性为internal
。这使得该属性仅对同一程序集中的类型可见。
当然,这意味着Module
(以及要"隐藏"Foo
的任何其他类型)需要在不同的程序集中定义,否则它也可以访问该属性。
Assembly1.dll
:
public class Extension {
Public string Name {get; set;}
Public List<View> Views {get; set;}
}
public class Component : Extension {
// View.Foo is accessible here;
}
public class View {
internal object Foo {get; set;}
}
Assembly2.dll
:
public class Module : Extension {
// View.Foo is not visible here
}