c#使用Enum GetName访问特定的类

时间:2013-12-28 19:02:22

标签: c# enums

RootObject.cs

    public class RootObject
    {
        public Class1 Class1 { get; set; }
        public Class2 Class2 { get; set; }
        public Class3 Class3 { get; set; }
    }

Class1.cs(Class2,Class3,....)

    public class Class1
    {
        public string name { get; set; }
        public string surname { get; set; }
    }

Enum.cs

public enum Classes
{
    Class1,
    Class2,
    Class3
}

MyFunction.cs

nItemCount = Enum.GetNames(typeof(Classes)).Length;  /* equal to 3 */

for (i=0 ; i < nItemCount; i++)
{
    string name = RootObject.(Enum.GetName(typeof(Classes), i)).name;
}

我想获得Class1,Class2,Class3等的名称值,就像上面的方法一样。

我希望我能解释一下我的问题。

我需要一个解决方案来使用枚举值访问循环中的所有类。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

您必须将代码更改为如下所示。注意我已使用Classes作为属性的数据类型。

public class RootObject
    {
        public Classes ClassProp { get; set; }
    }

    public enum Classes
    {
        Class1,
        Class2,
        Class3
    }

然后您可以使用以下代码访问这些属性。您将必须实例化该类,然后访问该属性,因为它们是对象级别的特性,而不是静态的。另请注意,您必须设置属性以获取适当的枚举值。

RootObject rootObj = new RootObject();
rootObj.ClassProp = Classes.Class2;
var class2 = rootObj.ClassProp;

答案 1 :(得分:0)

首先,如果你的所有类型Class1,Class2,Class3,...,ClassWhatNot共享相同的属性定义,最好将这些相同的属性定义移动到上面提到的类的公共 BaseClass 中将继承自。

class BaseClass
{
    public string Name { get; set;}
}

class Class1 : BaseClass
{
    ...
}

class Class2 : BaseClass
{
    ...
}

//... do the definition of Class3 in the same way


按如下方式实现 RootClass (请注意,我更改了名称以使其更清晰:)

class RootClass
{
    public enum PropertyEnum
    {
        propClass1,
        propClass2,
        propClass3
    }

    public Class1 propClass1 { get; set; }
    public Class2 propClass2 { get; set; }
    public Class3 propClass3 { get; set; }

    public BaseClass GetPropertyByEnum(RootClass.PropertyEnum enumValue)
    {
        PropertyInfo pi = typeof(RootClass).GetProperty(enumValue.ToString());
        return pi.GetValue(instance, null) as BaseClass;
    }
}

使用 GetPropertyByEnum 方法,您可以轻松完成:

RootClass rootObj = ...create/get the root object

foreach(RootClass.PropertyEnum enumValue in Enum.GetValues(typeof(RootClass.PropertyEnum))
{
    BaseClass b = rootObj.GetPropertyByEnum(enumValue);
    if (b != null) Console.Out.WriteLine("{0}.name = {1}", enumValue.ToString(), b.Name);
}

注意,当不使用公共基类(例如我的示例中的 BaseClass )时, GetPropertyByName 只能返回类型为Object的引用。在这种情况下,您需要知道如何将返回的对象强制转换为适当的类型,这将使​​得通过枚举访问属性的整个过程大多没有意义......

答案 2 :(得分:0)

如果您的类共享公共成员,请将它们移动到公共基类,或让类实现公共接口(或两者)。

public abstract class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

public class Customer : Person
{
    public Address DeliveryAddress { get; set; }
}

public class Employee : Person
{
    public string Profession { get; set; }
}

然后,不是为每个类创建单独的属性,而是将它们添加到数组中并使用枚举值作为索引:

public enum PersonType
{
    Customer = 0,
    Employee = 1,
    Supplier = 2
}

public class RootObject
{
    Person[] _persons = new Person[] {
        new Customer(),
        new Employee(),
        new Supplier()
    };

    public Person[] Persons { get { return _persons; } }
}

现在您可以使用

轻松访问这些人
foreach (PersonType personType in (PersonType[])Enum.GetValues(typeof(PersonType))) {
    Person p = rootObject.Persons[(int)personType];
    string name = p.Name;
    string surname = p.Surname;
    // ...
}