1

C# のコードにクラスがあり、ネストされたクラスからすべての属性を、パラメーターの数のサイズとオブジェクトの配列内のすべての内容を持つ配列に取得したいと考えています。次のように:

class MyClass {
 class Parameters {
  public const string A = "A";
  public const string B = "B";
  public const string C = "C";
  public const string D = "D";
  public const string E = "E";
  public const string F = "F";
 }    

 public object[] getAllParameters() {
    object[] array = new object[6];
    array[0] = Parameters.A;
    array[1] = Parameters.B;
    array[2] = Parameters.C;
    array[3] = Parameters.D;
    array[4] = Parameters.E;
    array[5] = Parameters.F;
}       
//more methods and code

}

Gしかし、たとえば、パラメーターを追加したい場合は、メソッドのサイズ、初期化、およびコードの他の部分のその他のものHを更新する必要があります。getAllParameters

getAllParameters明示的なパラメータを考慮せずに、この " " メソッドをより一般的にすることはできますか? 多分反射で?

4

6 に答える 6

2

nullフィールドは定数であるため、で使用するオブジェクトインスタンスは必要ありませんGetValue。また、これらはフィールドであり、プロパティではありません。

  var fields = typeof(Parameters).GetFields();
  object[] array = new object[fields.Count()];
  for (int i = 0; i < fields.Count(); i++)
  {
    array[i] = fields[i].GetValue(null);
  }
  return array;
于 2013-02-20T10:29:59.357 に答える
0

それを行うのは奇妙な方法のようですが、それは可能です。オブジェクトのインスタンスとそのタイプの両方が必要です。次に、タイプのすべてのプロパティを取得し、それぞれをループして、上記のクラスのインスタンスで各プロパティの値を取得できます。

TestClass obj = new TestClass();
Type t = typeof(TestClass);
foreach (var property in t.GetProperties())
{
    var value = property.GetValue(obj);
}
于 2013-02-20T10:25:56.607 に答える
0

あなたは反射を使用してそれを行うことができます。

typeof(MyClass).GetFields ();

FieldInfo配列を返します。次に、を使用して各フィールドの値を取得します。

filedinfo.GetValue (myobject);
于 2013-02-20T10:26:51.730 に答える
0

反射を使用します。次に例を示します。

class A
{
    public string F1;
    public string F2;
}

そしてメソッドで:

var a = new A();
var fields = typeof (A).GetFields();

var values = from fieldInfo in fields
             select fieldInfo.GetValue(a);
于 2013-02-20T10:28:53.407 に答える
0

あなたが望むのは、クラスを配列にシリアル化することです。なぜ車輪を再発明するのでしょうか? オブジェクトをシリアル化する既存のメソッドを使用し、特定のニーズに合わせてカスタマイズします。

于 2013-02-20T10:24:22.640 に答える
-1

Type.GetPropertiesPropertyInfo.GetValueと組み合わせることができます

于 2013-02-20T10:25:57.380 に答える