如何使嵌套结构访问其父类的字段而又不将其公开或内部化?

时间:2019-03-11 16:52:45

标签: c# access-modifiers

我在一个类中有一个double[,]字段,并且不能直接将其直接传递给外部,这一点很重要,因此我创建了一个读写属性来控制它并将其设置为{{1} }。我在类中还有一个嵌套的private,我想将其保留为值类型。结构本身具有一个struct字段,该字段再次由相应的读写属性控制。在给定特定条件的情况下,如果为属性分配了以特定方式无效的值,则它将引发自定义double[,]。我需要传递给exception的参数之一是基于父类中exception字段的值,但是如果没有结构,我似乎无法从结构中访问它设为double[,]public。我已经尝试过internalprotected,但都没有用。还有其他解决方法吗?

private

我正在考虑可能访问属性而不是字段,但是对于包含有问题的struct实例的特定实例,我将需要该属性的值。可能有类似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... } 的东西(我确实尝试过但没有用,但也许在概念上有一些变通方法)?

1 个答案:

答案 0 :(得分:2)

我假设您希望myStruct与包含的classField实例的myClass进行对话。

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

  

错误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概念不是隐式的-您需要自己实现。