【问题标题】:Access class fields from partial class从部分类访问类字段
【发布时间】:2010-11-09 11:14:20
【问题描述】:

我目前处于必须使用部分类的场景中。 在这个部分类中,我有一些方法需要处理其他类中的字段。

例如

编辑:对不起:第一堂课已经被声明为partial

public partial class myClass
{        
    private string _myString;

    public string myString
    {
        get { return _myString; }
        set { _myString = value; }
    }
}

public partial class myClass
{
    public void doSomething()
    {
        myString = "newString";
    }
}

编译器说 myString 在部分类中不存在!

我该如何克服这个问题?

【问题讨论】:

    标签: c# partial-classes


    【解决方案1】:

    一个常见的问题是部分类位于不同的命名空间中。命名空间是类名的一部分,namespace1.myClassnamespace.a.myClass 作为两个完全独立的类处理。

    根据MSDN, 部分类的每个部分应该:

    • 具有partial 修饰符
    • 具有相同的类名
    • 在同一个命名空间中
    • 在同一个程序集或 DLL 中
    • 具有相同的可见性(如公共、私有等)

    【讨论】:

      【解决方案2】:

      您需要用您发布的代码修复一些问题:

      在 C# 中使用分部类时,类的所有部分必须声明为分部类

      你有:

       public class myClass {}
       public partial class myClass {}
      

      需要变成:

      public partial class myClass {}
      public partial class myClass {}
      

      其次,您尝试设置:

      myString="newString";
      

      但是myString 是一个没有setter 的公共属性。

      所以要么你在声明myString时添加一个setter:

      public string myString
      {
          get{ return _myString; }
          set { _myString = value; }
      }
      

      或者直接使用:

      _myString="newString";
      

      在您的第二个部分类文件中。

      【讨论】:

        【解决方案3】:

        当我将您的代码放入 Visual Studio 时,我得到了一个不同的错误:

        myString = "newString";
        Error   Property or indexer 'ConsoleApplication1.Program.myClass.myString' cannot be assigned to -- it is read only
        

        如果我把它改成这个,它工作正常:

        _myString = "newString";
        

        编辑:

        不需要在两个宫殿中都将一个类标记为部分,这样编译得很好:

            public class myClass
            {
        
                private string _myString;
        
                public string myString
                {
                    get { return _myString; }
                }
            }
        
        
            public partial class myClass
            {
        
                public void doSomething()
                {
                    _myString = "newString";
                }
        
            }
        

        【讨论】:

        • 虽然它可能编译得很好,但在文档中它说它是必需的。无论如何,这样做可能是一个好主意,以保持一致和未来的证明。
        • 我只是按照表单设计器的操作...调皮的 winForms 设计器!
        • 我遇到了同样的问题,直到我注意到我的方法是静态的。呵呵!
        【解决方案4】:

        假设两个声明都引用同一个命名空间,你的第一个声明不包含 partial 关键字:

        使用 partial 关键字表示 类的其他部分,结构, 或者接口可以定义在 命名空间。所有部件都必须使用 部分关键字。所有部件都必须 可在编译时形成 最后的类型。所有部件必须 具有相同的可访问性,例如 public、private 等等。public、private 等等。

        http://msdn.microsoft.com/en-en/library/wa80x488(v=VS.80).aspx

        【讨论】:

          【解决方案5】:

          您只需在两个处将班级标记为partial,而不仅仅是其中一个。

          【讨论】:

            猜你喜欢
            • 2021-03-13
            • 1970-01-01
            • 2011-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-21
            相关资源
            最近更新 更多