c# 使用 Enum GetName 访问特定类



RootObject.cs

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

1 类.cs(2 类、3 类等)

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

恩努姆.cs

public enum Classes
{
    Class1,
    Class2,
    Class3
}

我的函数.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;
}

我想像上面的方法一样获取类 1、类 2、类 3 等的名称值。

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

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

任何人都可以帮忙吗?

您必须将代码更改为如下所示。注意 我已使用 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;

如果您的类共享公共成员,请将这些成员移动到公共基类中,或者让类实现公共接口(或两者兼而有之)。

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;
    // ...
}

首先,如果所有类型 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 的引用。在这种情况下,您需要知道如何将返回的对象强制转换为适当的类型,这将使通过枚举访问属性的整个努力变得毫无意义......

最新更新