【问题标题】:How to access an enum through an array object instance of a class如何通过类的数组对象实例访问枚举
【发布时间】:2016-03-06 02:59:47
【问题描述】:

我想知道我是否可以通过类的数组对象访问在类中声明的枚举......到目前为止,我无法访问它。这是一个插图。

class MyClass
{
    public enum gender { male, female };
    MyClass[] cs = new MyClass[];
    for (int i = 1; i < max; i++)
    {
        cs[i].gender = male; //I cant do this
    }
}

【问题讨论】:

    标签: c# arrays class oop enums


    【解决方案1】:

    您需要做的是在您的班级中拥有一个 instance - 本身 - 或者更确切地说是您的 Gender 枚举的“价值”,例如MyGender。此外,您不能只在类主体中使用for 循环;它需要在一个方法中:

    class MyClass
    {
        public Gender MyGender { get; set; }
        public enum Gender { male, female }    
        private static MyClass[] cs = new MyClass[];
    
        public static void DoSomething()
        {
            for (int i = 1; i < max; i++)
            {
                cs[i].MyGender = MyClass.Gender.male; 
            }
        }
    }
    

    此外,枚举应使用Pascal 大小写命名。

    【讨论】:

      【解决方案2】:

      你需要在这里分解一些你的东西。当这无效时,您正在尝试在类内执行循环。您可以将以下代码复制并粘贴到LinqPad 中进行试用。

      以下是枚举、类的基本示例,其中类以可重用的方式分开使用。

      void Main()
      {
          const int arraySize = 10;
          MyClass[] classes = new MyClass[arraySize];
          for (var i = 0; i < classes.Length; i++)
          {
              if ((i % 2) == 0)
              {
                  classes[i] = new MyClass { Gender = Gender.Male };
              }
              else
              {
                  classes[i] = new MyClass { Gender = Gender.Female };
              }
          }
      
          for (var i = 0; i < classes.Length; i++)
          {
              Console.WriteLine(classes[i].ToString());
          }
      
      }
      
      public class MyClass
      {
          //Other properties here
          public Gender Gender { get; set; }
      
          //Constructors
      
          //Methods
      
          public override string ToString()
          {
      
              //Documentation: https://msdn.microsoft.com/en-us/library/dn961160.aspx
              return $"{nameof(MyClass)} has a Gender of { Gender }";
      
              /*
                 If no C# 6 then make your return statement this.
                 return string.Format("{0} has a Gender of {1}", typeof(MyClass).Name, Gender);
              */
          }
      }
      
      public enum Gender
      {
          Male,
          Female
      }
      

      输出:

      MyClass has a Gender of Male
      MyClass has a Gender of Female
      MyClass has a Gender of Male
      MyClass has a Gender of Female
      MyClass has a Gender of Male
      MyClass has a Gender of Female
      MyClass has a Gender of Male
      MyClass has a Gender of Female
      MyClass has a Gender of Male
      MyClass has a Gender of Female
      

      【讨论】:

      • C#中的 return $"***" 是什么意思?
      • 哦,要到VS2015才能用?我试过.net 4.0 VS2013,但没有编译。
      • 然后要在非 C# 6 中获得相同的结果,您可以使用 string.Format("{0} has a Gender of {1}", typeof(MyClass).Name, Gender)
      【解决方案3】:

      鉴于您编写性别枚举的方式,当创建 MyClass 的新实例时,Gender 属性(我必须添加此属性)将自动设置为男性。

      所以,如果你想要做的是初始化 cs 一次且仅一次(否则你会得到堆栈溢出,将 cs 设为静态并使用静态构造函数。

      编辑

      在我的第一个回答帖子中声明和初始化数组时没有使用 MAX。

      public class MyClass
      {
          const int MAX = 10;
      
          public enum gender { male, female }
          public gender Gender;
          static MyClass[] cs = new MyClass[MAX];
      
          static MyClass()
          {
              for (int i = 0; i < MAX; i++)
              {
                  cs[i] = new MyClass();
              }
          }
      }
      

      【讨论】:

      • 为了记录,我不会为自己正在做的任何事情这样编码。这只是为了尽可能以最方便的方式回答 OP。
      猜你喜欢
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多