【问题标题】:how to restrict setting a property of innerclass just from the outer class in c#如何限制仅从 C# 中的外部类设置内部类的属性
【发布时间】:2014-01-29 18:06:53
【问题描述】:

我有这样的代码:

public class OuterClass
{
    public static InnerClass GetInnerClass()
    {
        return new InnerClass() { MyProperty = 1 };
    }

    public class InnerClass
    {
        public int MyProperty { get; set; }
    }
}

什么是名为MyProperty 的属性的解决方案只能从InnerClassOuterClass 中设置,并且在这些范围之外,MyProperty 只是只读的

【问题讨论】:

  • 能够在施工后设置它吗?你能不能让它成为一个构造函数参数并拥有一个只读属性?
  • 您可以使用internal 处理此问题,并将类放在单独的程序集中。但你真的不应该想要。
  • 我很好奇一个现实世界的非人为例子需要这个。这似乎是一个方便的功能,但我怀疑OuterClassInnerClass 之间的关系可能需要与此处尝试的结构不同的结构。
  • @JonSkeet: 我不能让它成为构造函数参数
  • @Henk Holterman:我无法将其设置为internal

标签: c# class inner-classes outer-classes


【解决方案1】:

对此没有保护级别。 internal 是您可以使用的最紧凑的,仅限于同一程序集中的文件。如果您不能按照建议将其作为构造函数参数,则可以使用接口:

public class OuterClass
{
    public static InnerClass GetInnerClass()
    {
        return new InnerClassImpl() { MyProperty = 1 };
    }

    public interface InnerClass
    {
        int MyProperty { get; }
    }
    private class InnerClassImpl : InnerClass
    {
        public int MyProperty { get; set; }
    }
}

【讨论】:

  • InnerClassImpl 不应该从接口实现MyProperty 作为唯一的getter?
  • @am1r_5h:它实现了一个getter,这样就满足了接口。 setter 是特定于实现的,在这种情况下只有OuterClass 可以看到。 (这是在对象初始化器中设置值所必需的。)
【解决方案2】:

恐怕没有允许这样做的访问修饰符。您可以创建IInnerClass 接口并在接口声明中将属性设为只读:

public class OuterClass
{
    public static IInnerClass GetInnerClass()
    {
        return new InnerClass() { MyProperty = 1 };
    }

    public interface IInnerClass
    {
        int MyProperty { get; }
    }

    private class InnerClass : IInnerClass
    {
        public int MyProperty { get; set; }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多