-1

フィールドがリスト辞書やその他のクラスになる可能性のある複雑なクラスがあります。一部の基本的なデータ型は、、、intまたはいくつかの列挙型です。そのクラスのインスタンスと文字列を受け取り、文字列の言及があるかどうかに応じて true または false を返す関数を作成する必要があります。boolstring

public class Record
  {
    public Dictionary<string,int> Counts { get; set; }
    public Dictionary<string,list<string>> Syns {get; set;}
    public string Name { get; set; }
    public KeyValuePair<string,KeyValuePair<string,bool>> Stuff { get; set; }
    //etc 
  }

メソッドが行うべきことは次のとおりです

   public static bool IsValuePresent(Object o, string keyword)
     {
       //cycle through all possible string values of o and check if keyword is present. 
       //return true if so, otherwise false
     } 

可能な呼び出し:

 Record record = dbAccess.GetCurrent();
 bool flag = IsValuePresent(record, "Name");

注意: 使用できますToJSONが、オブジェクト プロパティの名前の中に が存在するかどうかを確認し"name"ますが、値のみを確認する必要があります。

4

2 に答える 2

0

再帰を使用し、System.Reflection を使用できるはずです。ここに良い投稿があります:

リフレクション - 自分のアセンブリ内でオブジェクトのプロパティを再帰的に反復する (Vb.Net/3.5)

見る:

foreach (PropertyInfo pi in o.GetType().GetProperties())
于 2013-01-08T20:31:14.160 に答える
0

誤解していたら申し訳ありませんが、最初にクラスのフィールドを参照する必要があると思います

record->field1またはrecord.field1(静的に割り当てられたクラスの場合)

これらのフィールドは辞書クラスであると想定しているため、辞書クラスのメソッドの 1 つを使用して文字列を見つけることができます。

record->field1.getindex("Name") 

次に、この手順全体をメソッドにラップして、レコード クラス内のメソッドにするか、外部メソッドにすることができます。以下では、内部メソッドを使用します。

template <class T>
bool Record :: IsValuePresent(T listobject, string in) {

switch (typeof(listobject))
{
   case 'dictionary'
     if(record->field1.getindex(in) != -1)  // -1 meaning not present in this example
     {
       return false;
     } else return true;
   case 'list'
    // more code
   default: 
     return false;
}

}

コンパイラは上記の方法を最適化する必要があります。

于 2013-01-08T20:36:38.677 に答える