2013-01-19 73 views
3

我正在尝试循环遍历字段,将某个类型的字段放入列表中,然后返回该列表。我知道我错过了一些关键组件,但我无法弄清楚我做错了什么。这是我到目前为止有:返回类中的所有字段

...

我需要返回的实际字段列表为指针,而不是数据的副本。任何帮助,让这个工作,将不胜感激。

我删除了上面的代码(你应该仍然可以在历史中看到它),因为它很混乱。这是更新的代码(除去一些额外的东西),从competent_tech工作多亏了答案:

string prop1; 
BaseClass prop2; 
SubClass prop3; 
SubClass prop4; 

public List<BaseClass> GetData() 
{ 
    List<BaseClass> DataList = new List<BaseClass>(); 

    foreach (System.Reflection.PropertyInfo thisInfo in this.GetType().GetProperties()) 
    { 
     var tempPropery = thisInfo.GetValue(this, null); 
     if (tempPropery.GetType().IsSubclassOf(typeof(BaseClass)) || tempPropery.GetType().Equals(typeof(BaseClass))) 
     { 
      DataList.Add((BaseClass)tempPropery); 
     }; 
    } 

    return DataList; 
} 

上面的代码可以让你从你的类得到一个特定的基本类型的所有属性,并返回他们在一个列表中。所以上面的代码会返回prop2 - prop4。

+1

我会用一个'词典<字符串,PrimaryAbility>'代替。那么你可以通过这种方式得到'STR':'var str = AllAbilities [“STR”];'。需要反思往往表明你应该重构你的代码。 –

+0

我正在寻找一种简单(但在开始时很复杂)的方式来返回所有能力(和其他类使用相同的结构),而不是每次添加新内容时都必须添加额外的代码行。 –

回答

2

您可以通过反射来完成此操作。

foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) { 
} 

有许多方法,一旦你拥有了它,你可以使用此信息或过滤的属性(例如,通过添加到您要收集的属性的属性)。

你可以得到更多的信息from MSDN

请注意,此代码特别引用属性,但也有检索字段(GetFields)和所有成员(GetMembers)的等效方法。

一旦你的的PropertyInfo,你可以调用GetValue方法:

 foreach (System.Reflection.PropertyInfo oProperty in this.GetType().GetProperties()) { 
      Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString()); 
     } 

或者,如果你正在寻找在两个字段和属性:

 foreach (System.Reflection.MemberInfo oMember in this.GetType().GetMembers()) 
     { 
      switch (oMember.MemberType) 
      { 
       case System.Reflection.MemberTypes.Field: 
        var oField = (System.Reflection.FieldInfo)oMember; 
        Console.WriteLine(oField.Name + " = " + oField.GetValue(this).ToString()); 
        break; 

       case System.Reflection.MemberTypes.Property: 
        var oProperty = (System.Reflection.PropertyInfo)oMember; 
        Console.WriteLine(oProperty.Name + " = " + oProperty.GetValue(this, null).ToString()); 
        break; 

      } 
     } 
+0

I需要进一步解释如何使用它。这与我的代码基本上是一样的:'var tempList = this.GetType()。GetMembers();' - 我不知道如何提取字段,只要我有信息​​。 –

+1

对不起,我已经更新了答案,以显示两种情况下名称和值的检索。 –

+0

完美谢谢!正是我需要的。 –

0

您可以在Dictionary中存储数据。每个属性只能从字典中设置/获取值。 事情是这样的:

public class MyData { 
    private Dictionary<string, object> myData; 
    public MyData { 
     this.myData = new Dictionary<string, object>(); 
    } 

    public decimal LastVersion { get { return (decimal)this.myData["LastVersion"]; } private set { this.myData["LastVersion"] = value; } } 

    public PrimaryAbility STR { get { return (PrimaryAbility)this.myData["STR"]; } private set { this.myData["STR"] = value; } } 
    public PrimaryAbility DEX { get { return (PrimaryAbility)this.myData["DEX"]; } private set { this.myData["DEX"] = value; } } 
    public PrimaryAbility CON { get { return (PrimaryAbility)this.myData["CON"]; } private set { this.myData["CON"] = value; } } 
    public PrimaryAbility INT { get { return (PrimaryAbility)this.myData["INT"]; } private set { this.myData["INT"] = value; } } 
    public PrimaryAbility WIS { get { return (PrimaryAbility)this.myData["WIS"]; } private set { this.myData["WIS"] = value; } } 
    public PrimaryAbility CHA { get { return (PrimaryAbility)this.myData["CHA"]; } private set { this.myData["CHA"] = value; } } 

    public DerivedAbility HP { get { return (DerivedAbility)this.myData["HP"]; } private set { this.myData["HP"] = value; } } 
    public DerivedAbility MP { get { return (DerivedAbility)this.myData["MP"]; } private set { this.myData["MP"] = value; } } 
    public DerivedAbility SP { get { return (DerivedAbility)this.myData["SP"]; } private set { this.myData["SP"] = value; } } 
    public DerivedAbility AC { get { return (DerivedAbility)this.myData["AC"]; } private set { this.myData["AC"] = value; } } 
} 
有一天,我发现这个

: “Enum.GetValues(typeof运算(TvStations))”,也许你应该寻找一些这样的。

相关问题