2

これはこれまでで最も基本的なことのように思えますが、どういうわけか答えを見つけることができず、理解できませんでした。

カスタムクラスがあるとしましょう:

public class WineCellar
{
   public string year;
   public string wine;
   public double nrbottles;
}

今、私は関数が欲しいです:

WineCellar ex = new WineCellar();
ex.members();

年、ワイン、nrbootles が返されます。

と:

 ex.members().types();

返すべき値: string、string、double

同様に、1 つのインスタンス {2010, Rioja, 6} があるとします。インデックス付けによってこれらを返す構文はありますか? すなわち

ex[1] 

また

ex.{1}

2010年を返しますか?

基本的な質問で申し訳ありません。

4

3 に答える 3

3

ミシェルがコメントで言ったように、これはより大きな問題に対する間違ったアプローチのように思えます。

ただし、この種のものが必要な場合は、リフレクションを使用して取得できます。

//returns a list of propertyInfo objects for the class 
// with all kinds of usefull information
public List<PropertyInfo> GetMemberInfos()
{
    return this.GetType().GetProperties().ToList();
}

//returns a list of property names
public List<string> GetMemberNames
{
    return this.GetType().GetProperties().Select(pi => pi.Name).ToList();
}

//returns a list of names of the property types
public List<string> GetMemberTypeNames
{
    return this.GetType().GetProperties().Select(pi => pi.PropertyType.Name).ToList();
}

//indexer that uses the property name to get the value
//since you are mixing types, you can't get more specific than object
public object this[string property]
{
  get { return this.GetType().GetProperty(property).GetValue(this); }
  set { this.GetType().GetProperty(property).SetValue(this, value); }
}

//indexer that uses the property index in the properties array to get the value
public object this[int index]
{
  get { return this.GetType().GetProperties()[index].GetValue(this); }
  set { this.GetType().GetProperties()[index].SetValue(this, value); }
}

一般にリフレクションは遅いため、これらのメソッドはすべて非常に遅いことに注意してください。何かをキャッシュして速度を上げることができます。

また、最後の方法は実に危険です。順序が保証されていない配列の読み取りと書き込みを (試行) します。実際、ドキュメントでは次のように指定されています。

GetProperties メソッドは、アルファベット順や宣言順など、特定の順序でプロパティを返しません。プロパティが返される順序はさまざまであるため、コードはプロパティが返される順序に依存してはなりません。

たとえば、クラスを次のように変更するとします。

public class WineCellar
{
  public string year;
  public string region;
  public string wine;
  public double nrbottles;
}

プロパティではなく、プロパティを更新するwinecellar[1] = "Pinot Noir"可能性が最も高いです。regionwine

于 2013-08-14T14:46:23.730 に答える
1

これは、Members メソッドを実装する方法です (プロパティ名を文字列として使用する場合)。

public List<string> Members()
{
   List<string> propNames = new List<string>();
   foreach (var prop in typeof(WineCellar).GetProperties())
   {
       propNames.Add(prop.Name);
   }
   return propNames;
}

そして、これがタイプを実装する方法です(同じ場合)

public List<string> Types()
{
   List<string> propTypes = new List<string>();
   foreach (var prop in typeof(WineCellar).GetProperties())
   {
       propTypes.Add(prop.PropertyType.ToString());
   }
   return propTypes ;
}

最後に、この ex[n] のようなパラメーターの値を取得したい場合は、このようにクラスで単純なインデクサーを作成できます

public string this[int n]
{
   get
   {
       int current = 0;
       foreach (var prop in typeof(WineCellar).GetProperties())
       {
          if (current == n)
             return prop.GetValue(this, null).ToString();
          current++;
       }
       return null;
   }
}

ただし、これらのメソッドを機能させるには、変数を次のようなプロパティに変更する必要があります

public class WineCellar
{
   public string Year { get; set; }
   public string Wine { get; set; }
   public double Nrbottles { get; set; }
}
于 2013-08-14T14:37:11.770 に答える