2017-03-22 5 views
4

これらのすべての条件に同じパターンがある場合は、 この方法の重複を減らすための一般的な方法を思い付くアイデアはありますか?一般的なパターンここでは重複を減らすために簡略化しようとしています

public override Func<JObject, dynamic, string> version => (jobject, parameters) => 
    { 
     bool hasValidObject = false; 

     if (jobject["Version1"] != null) 
     { 
      _radio.Version1 = new VersionInfo(jobject["Version1"].Value<string>()); 
      hasValidObject = true; 
     } 

     if (jobject["Version2"] != null) 
     { 
      _radio.Version2 = new VersionInfo(jobject["Version2"].Value<string>()); 
      hasValidObject = true; 
     } 

     if (jobject["Version3"] != null) 
     { 
      _radio.Version3 = new VersionInfo(jobject["Version3"].Value<string>()); 
      hasValidObject = true; 
     } 

     if (jobject["Version4"] != null) 
     { 
      _radio.Version4 = new VersionInfo(jobject["Version4"].Value<string>()); 
      hasValidObject = true; 
     } 

     if (jobject["Version6"] != null) 
     { 
      _radio.Version6 = new VersionInfo(jobject["Version6"].Value<string>()); 
      hasValidObject = true; 
     } 

     if (hasValidObject) 
     { 
      return GenerateSuccess(); 
     } 

     return GenerateUnsuccessful(try again."); 
    }; 
+0

'_'で1つの' Version'オブジェクトを使用できますか?もしそうなら、forループを1から6まで持つことができ、 'jobject [" Version "+ i.ToString()]'のようなものを使ってこれらの値を取得/設定することができます。代わりに、リフレクションを使用して、あなたの 'i'に対応するプロパティを取得します。 – PoweredByOrange

+0

はそれぞれ異なるバージョンです(ハードウェアバージョン、モバイルバージョン、テレビ版など) –

+0

少なくともバージョンの作成を別のメソッドに移動すると、_radio.Version1 = GetVersion(jObject、nameof(_radio.Version1))となります。 'あなたが100バージョンを持っていない限り、そのような少しの利益の反映を避ける方がいいですが、とにかくクラスを再設計する必要があります。 – Evk

答えて

1

別の方法としては、switch文で使用できます

public override Func<JObject, dynamic, string> version => (jobject, parameters) => 
{ 
    bool hasValidObject = false; 

    foreach (char n in "12346") 
    { 
     var jObj = jobject["Version" + n]; 
     if (jObj != null) 
     { 
      var versionInfo = new VersionInfo(jObj.Value<string>()); 
      switch (n) 
      { 
       case '1': _radio.Version1 = versionInfo; break; 
       case '2': _radio.Version2 = versionInfo; break; 
       case '3': _radio.Version3 = versionInfo; break; 
       case '4': _radio.Version4 = versionInfo; break; 
       case '6': _radio.Version6 = versionInfo; break; 
      } 
      hasValidObject = true; 
     } 
    } 

    return hasValidObject ? GenerateSuccess() : GenerateUnsuccessful(" try again."); 
}; 

またはデリゲートの配列を持つより高度なバージョン..私は垂直スペースが好きだから:](テストされていない):

public override Func<JObject, dynamic, string> version => (jobject, parameters) => 
{ 
    Func<VersionInfo, VersionInfo>[] a = { null, _radio.Version1 = v, 
       v => _radio.Version2 = v, v => _radio.Version3 = v, 
       v => _radio.Version4 = v, null, v => _radio.Version6 = v }; 

    var q = from n in new[] { 1, 2, 3, 4, 6 } 
      let j = jobject["Version" + n] where j != null 
      select a[n](new VersionInfo(j.Value<string>())); 

    return q.Count() > 0 ? GenerateSuccess() : GenerateUnsuccessful(" try again."); 
}; 
0

jオブジェクト辞書型である場合、あなたは問題がラジオであるが、それはあなたのクラスならば、あなたがたバージョンの配列を使用することができます

foreach(string version in jobject.keys) 
{ 
    if(jobject[version]!=null){ 
    //do something 
    } 
} 

を使用して、その上で実行することができますループの番号を数えるために使用するカウンタを使ってクラスにアクセスしてください。

2

1つの方法は、リフレクションとループを使用することです。

もう一つの方法は、あなたの _radioクラスで Dictionary<int,VersionInfo> Versionsを作成し、その後、あなたが反射を必要としないだろう
public override Func version => (jobject, parameters) => 
{ 
    bool hasValidObject = false; 
    for (int i = 1; i<7;i++) 
    { 
     hasValidObject = this.SetVersionInfo(i) || hasValidObject; 
    } 

    if (hasValidObject) 
    { 
     return GenerateSuccess(); 
    } 

    return GenerateUnsuccessful("try again."); 
}; 


private bool SetVersionInfo(int i) 
{ 
    if (jobject["Version" + i] == null) return false; 

    _radio.GetType().GetProperty(propName) 
     .SetValue(_radio, new VersionInfo(jobject["Version" + i].Value<string>())); 
    return true; 
} 

private bool SetVersionInfo(int i) 
{ 
    if (jobject["Version" + i] == null) return false; 

    _radio.Versions[i] = new VersionInfo(jobject["Version" + i].Value<string>()); 
    return true; 
} 
+0

名前でプロパティに動的にアクセスするコードが必要な場合を除き、リフレクションを使用すると過剰な操作が行われ、パフォーマンス上の問題が発生する可能性があります。 –

関連する問題