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を返します。

4

2 に答える 2

2

あなたは反射を通してこれを達成することができます。

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

この情報を取得した後、またはプロパティをフィルタリングして(たとえば、収集するプロパティに属性を追加することにより)、この情報を使用する方法は多数あります。

詳細については、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;

            }
        }
于 2013-01-19T01:53:43.113 に答える
0

辞書にデータを保存できます。すべてのプロパティについて、辞書から値を設定/取得するだけです。このようなもの:

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))"、多分あなたはこのようなものを検索するべきです。

于 2013-01-19T01:43:40.237 に答える