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等的名称值,就像上面的方法一样。
我希望我能解释一下我的问题。
我需要一个解决方案来使用枚举值访问循环中的所有类。
有人可以帮忙吗?
答案 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;
// ...
}