2

関数の配列のようにループできるようにしたい get プロパティがいくつかあります。このようなことができるようになりたいです

public int prop1 { get; }
public string prop2 { get; }
public int[] prop3 { get; }
public int prop4 { get; }
public string prop5 { get; }
public string prop6 { get; }

Func<var> myProperties = { prop1, prop2, prop3, prop4, prop5, prop6 };

ArrayList myList = new ArrayList();
foreach( var p in myProperties)
{
    myList.Add(p);
}

このコードは非常に壊れていますが、私がやりたいことのアイデアを伝えていると思います。どうすればこれを達成できるか知っている人はいますか?

4

6 に答える 6

6

リフレクションを使用して、タイプ内のプロパティにアクセスできます。

class MyType
{
    public int prop1 { get; }
    public string prop2 { get; }
    public int[] prop3 { get; }
    public int prop4 { get; }
    public string prop5 { get; }
    public string prop6 { get; }

    public List<string> GetAllPropertyValues()
    {
        List<string> values = new List<string>();
        foreach (var pi in typeof(MyType).GetProperties())
        {
            values.Add(pi.GetValue(this, null).ToString());
        }

        return values;
    }
}

リフレクションは遅いため、より良い方法がある場合はこれを使用しないでください。たとえば、プロパティが 6 つしかないことがわかっている場合は、それらを個別に調べてください。

于 2013-03-09T23:30:50.220 に答える
0

使用してみることができますGetProperties

GetProperties ドキュメント

例:

PropertyInfo[] myPropertyInfo;
// Get the properties of 'Type' class object.
myPropertyInfo = Type.GetType("System.Type").GetProperties();
Console.WriteLine("Properties of System.Type are:");
for (int i = 0; i < myPropertyInfo.Length; i++)
{
    Console.WriteLine(myPropertyInfo[i].ToString());
}

詳細情報:フラグを使用した GetProperties
の例は非常に優れており、プロパティの特定のサブセットにアクセスしたい場合に役立ちます (パブリックなもののみのように)。

于 2013-03-09T23:25:05.620 に答える
0

ループしたいすべてのプロパティがすでにわかっている場合は、これを試すことができます

List<Reflection.PropertyInfo> myProperties = new List()<object>
{
    typeof(SomeType).GetProperty("prop1"), 
    typeof(SomeType).GetProperty("prop2"), 
    typeof(SomeType).GetProperty("prop3"), 
    typeof(SomeType).GetProperty("prop4"), 
    typeof(SomeType).GetProperty("prop5"), 
    typeof(SomeType).GetProperty("prop6")
};

foreach(var p in myProperties)
{
    var value = p.GetValue(someObject, new object[0]);
    myList.Add(p);
}

そうでない場合は、次のようなものを使用できます。

var myProperties = 
    from pi in someObject.GetType().GetProperties()
    select new 
    {
        pi.Name, 
        Value = pi.GetValue(object, new object[0])
    };

foreach(var p in myProperties)
{
    myList.Add(p.Value);
}
于 2013-03-09T23:25:21.733 に答える
0

コードはそれほど遠くありません。myProperties変数は配列である必要があり、プロパティから読み取る関数を作成する必要があります。(プロパティ getter は実際には関数として実装されていますが、関数として呼び出したり、参照を取得したりすることはできません。) 次に、それらを呼び出して使用します。

public class MyClass {

  public int prop1 { get; set; }
  public string prop2 { get; set; }
  public int[] prop3 { get; set; }
  public int prop4 { get; set; }
  public string prop5 { get; set; }
  public string prop6 { get; set; }

  public ArrayList GetProperties() {

    Func<object>[] myProperties = {
      () => prop1, () => prop2, () => prop3,
      () => prop4, () => prop5, () => prop6
    };

    ArrayList myList = new ArrayList();
    foreach (var p in myProperties) {
      myList.Add(p());
    }

    return myList;
  }

}
于 2013-03-09T23:36:39.510 に答える