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