0

一个简单的问题:

public class class1
{
     public string string1;
     public class class2
     {
         public string string2
         {
             get{ string tmp = class1.string1;  } 
         }
     }

}

我希望能够从 class2.string2.get 到达 class1.string1,但我不能。你会建议我改变什么,以便我能做到这一点?

谢谢

4

4 回答 4

1

没有办法从我知道的嵌套类中访问一个类。类嵌套不会导致周围类的自动实例化,它只是一种(通常相当臭的)结构化代码的方法。

您要么需要引用 Class2 中的 Class1 的实际实例,要么需要 Class1 上的静态方法。

实现这一点的另一种方法是使用继承,但这是一个完全不同的驯服野兽:

public class Class1 {
    protected String String1 { get; set; }
}

public class Class2 : Class1 {
    public String String2 {
        get {
            String PropertyFromClass1 = base.String1;
            // ...
        }
    }
}

也就是说:您的代码无法编译,string2' 的 getter 不会返回任何内容。请熟悉C# 的命名约定

于 2013-06-20T09:54:19.890 回答
1

在构造函数中将 class1 引用传递给 class2:

public class class1 {
  public string string1;
  public class class2 {
    private class1 _Reference;
    public class2(class1 reference) {
      if (reference == null) {
        throw new ArgumentNullException("reference");
      }
      _Reference = reference;
    }
    public string string2 {
      get { return _Reference.string1; }
    }
  }

}

在创建两个类后将 class1 引用传递给 class2:

public class class1 {
  public string string1;
  public class class2 {
    private class1 _Reference;

    public class1 Reference {
      set { _Reference = value; }
    }

    public string string2 {
      get { return _Reference.string1; }
    }
  }

}

static void usage() {
  var foo = new class1();
  var bar = new class1.class2();
  bar.Reference = foo;
  string value = bar.string2;
}
于 2013-06-20T09:34:19.960 回答
0

来自 Java,当我开始使用 C# 开发时,我遇到了这个“问题”。

正如Dennis Traub这篇C# 文章中明确解释的那样,您不能访问外部类成员或方法。所以你必须实现Java中自动发生的事情:

class OuterClass {
    string s;
    // ...
    class InnerClass {
        OuterClass o_;
        public InnerClass(OuterClass o) { o_ = o; }

        public string GetOuterString() { return o_.s; }
        }

    void SomeFunction() {
        InnerClass i = new InnerClass(this);
        i.GetOuterString();
    }
}
于 2013-06-20T10:26:52.657 回答
0

感谢您的建议。由于代码的特殊性,我不得不使用另一个命名空间中的全局公共静态类来解决这种情况。

于 2013-06-20T09:59:08.607 回答