只有当父类是特定的时,属性才可用

本文关键字:属性 父类 | 更新日期: 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

请求的目的非常模糊,但如果ComponentView在同一程序集中定义,则可以选择使属性为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
}