2016-09-23 3 views
0

これは質問文を作成するのに最適です。親切にしてください。私は記入する必要が chkAwareness1、chkAwareness2、chkAwareness6、chkAwareness9、chkAwareness13 ...プロパティの名前が別の配列にある場合、プロパティにブール値を割り当てます。

私はカンマ区切り形式の値を含む文字列 "InputValues" を持っている:ここでは

は、状況です名前が上記の文字列変数にあるものと一致する場合、bool値を持つオブジェクト。

例: InputValuesに「chkAwareness1」が含まれている場合は、「public bool chkAwareness1」がtrueに設定されている必要があります。

public class SurveyCheckBox 
    { 
     public bool chkAwareness1 { get; set; } 
     public bool chkAwareness2 { get; set; } 
     public bool chkAwareness3 { get; set; } 
     public bool chkAwareness4 { get; set; } 
     public bool chkAwareness5 { get; set; } 
     public bool chkAwareness6 { get; set; } 
     public bool chkAwareness7 { get; set; } 
         . 
         . 
         . 
    } 

public void createObjectSurveyCheckBox(string InputValues) 
{ 
    string[] ChkValues = InputValues.Split(','); 
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox(); 
    for (int i = 0; i < NumberOfPropertyInSurveyCheckBox ;i++) 
    { 
     // typeof(SurveyCheckBox).GetProperties()[i].Name 
    } 
} 

私が検索し、私は値を検索し、プロパティをBOOLするためにそれらを割り当てる方法..私はプロパティの名前を取得することができますが、私はロジックを把握することができませんそれを通してGetPropertiesの方法を発見しました。

助けてください。

+2

あなたは誰かが変数名を変更した場合(実行時に)黙って壊しコードを書くのはなぜ?代わりに、単一の 'Dictionary 'または 'Dictionary 'を使用してください。 –

+0

これらの値はAngularアプリからのhttpリクエストを経由して来ており、私はwebApiで受け取っています。そのイントラネットアプリケーションとコードチェンジは私の手の中だけにあります。 63個の値を持つオブジェクトを送信する代わりに、63個のチェックボックスがあり、その値はWebapiに送信する必要があります。チェックされたチェックボックスの名前を送信しました。 – Sak

+2

安全ではなく、効率的ではなく、とにかく保守し理解しにくいコードを書く理由はありません。データベース内のレコードごとに1つのテーブルを使用することはなく、同じエンティティを表すレコードを同じテーブルに挿入します。 –

答えて

2

あなたは非常に近いです。本当にループを変更するだけです。全体の方法は次のようになります。

public void CreateObjectSurveyCheckBox(string inputValues) 
{ 
    string[] chkValues = inputValues.Split(','); 
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox(); 
    foreach (string value in chkValues) 
    { 
     PropertyInfo propInfo = typeof(SurveyCheckBox).GetProperty(value); 
     if (propInfo != null) 
      propInfo.SetValue(surveyChkBoxObj, true); 
    } 
} 

P.S.私は大文字を自由に変えて、もっと大まかなものにすることに気付くでしょう。あなたが持っていたように大文字を使用すると、あなたは素直になるだろう。

+1

ありがとうございます。これは私の望むように機能します。私はTimにも同意します。コードは良くありません。しばらくの間それを使ってより良い方法を探します。 – Sak

0

私はTimに同意します。私は生産コードでこのようなものを使用しません。

public void createObjectSurveyCheckBox(string InputValues) 
    { 
     var instance = new SurveyCheckBox(); 

     foreach (var property in typeof(SurveyCheckBox).GetProperties().Where(x => x.Name.Contains("chkAwareness"))) 
     { 
      if (InputValues.Contains(property.Name)) 
       property.SetValue(instance, true); 
     } 
    } 
+0

私は同意する、私はこのコードをしばらく置いて、より良い方法を考えるだろう。 – Sak

0

私はループを0からMaxchkAwarenessの方向に書きます。 ループに入る前に、入力を最初にソートします。 また、入力配列(ChkValues)の次の項目へのインデックスが必要です。これをchkValueIndexと呼びます。 入力配列の次の項目、ChkValues [chkValueIndex]が "chkAwareness" + i.ToString() の場合、プロパティはtrueで、配列ポインタが増加します。 それ以外の場合、プロパティはfalseです。 は、しかし、私はあなたがそのようなループ、このようなものでプロパティを設定するためにリフレクションを使用する必要が思う: Getting a property reference using reflection

私はこれを再構築するためのより良い方法があると確信していると、それは完全に異なるやるが、それは私に聞こえますあなたに与えられたシステムでできる限りのことをしようとしているように。

+0

心配しないで、私はitsme86のアイデアを見ています。それははるかにクリーンです。 –

0

あなたはこれを試すことができます。

public static void createObjectSurveyCheckBox(string InputValues) 
{ 
    string[] ChkValues = InputValues.Split(','); 
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox(); 
    foreach (var prop in typeof(SurveyCheckBox).GetProperties()) 
    { 
     if (ChkValues.Contains(prop.Name)) 
      prop.SetValue(surveyChkBoxObj, true); 
    } 
} 
関連する問題