如何在不将这些字段设置为公共或内部的情况下为嵌套结构访问其父类的字段?

问题描述 投票:2回答:1

我在一个类中有一个double[,]字段,重要的是直接访问它不会被赋予外部,所以我创建了一个读写属性来控制它并使它成为private。我在类中也有一个嵌套的struct,我想保留它作为一个值类型。结构本身有一个double[,]字段,它再次由相应的读写属性控制。在给定某些条件的情况下,如果为属性指定了以特定方式无效的值,则会抛出自定义exception。我需要传递给exception的一个参数是基于父类的double[,]字段的值,但是我似乎无法从结构中访问它而不使它成为publicinternal。我已经尝试了protectedprivate,但都没有效果。还有另一种解决方法吗?

class myClass {
    protected double[,] classField;
    public double[,] classProperty {
        get { return (double[,])classField.Clone();
        set { /* code to validate the value and assign it */ }
    }
    private struct myStruct {
        private double[,] structField;
        public structProperty{ 
            get { return (double[,])structField.Clone(); }
            set {
                if (!validate(value)) 
                    throw new customException(classField.getLength(1));
                structField = (double[,])value.Clone();
            }
        }
        //other fields, constructors, and methods...
    }
    //other fields, constructors, and methods...
}

我正在考虑可能访问属性而不是字段,但我需要属性的值来处理有问题的struct实例的特定实例。是否有类似this.parent的东西(我确实尝试过这个并不起作用,但也许在概念上类似的一些解决方法)?

c# access-modifiers
1个回答
2
投票

我假设您希望myStruct与包含classField实例的myClass交谈。

如果是这种情况:那么问题不是可访问性 - 它已经具有访问权限;问题是范围。就编译器而言,嵌套在这里与实例化无关,所以问题是myStruct没有特定的classProperty实例可以与之交谈。这就是错误的原因:

错误CS0120非静态字段,方法或属性'myClass.classField'需要对象引用

而不是可访问性:

错误CS0122'myClass.classField'由于其保护级别而无法访问

事实上,classField在可访问性方面可以是private:嵌套类型可以看到包含类型的private成员。

你需要做的是:

private struct myStruct
{
    private readonly myClass _obj;
    public myStruct(myClass obj) => _obj = obj;
    // ...
}

而不只是classField,你需要告诉它与_obj.classField交谈,告诉它实例。你还需要构建与其相关的特定myStruct传递的myClass

基本上:你在问题中提到的this.parent概念并不是隐含的 - 你需要自己实现它。

© www.soinside.com 2019 - 2024. All rights reserved.