1

次のような文字列のリストがあります。

public string TypeOrig { get; set; }
public string TypeAdj { get; set; }
public string TypeClass { get; set; }
public string TypeMsg { get; set; }
public string QtyOrig { get; set; }
public string QtyAdj { get; set; }
public string QtyClass { get; set; }
public string QtyMsg { get; set; }

データベースの行に基づいて、次のように文字列を入力します。

switch(fRow["fieldName"].ToString())
{
    case "partType":
        TypeOrig = fRow["original"].ToString();
        TypeAdj = fRow["adjusted"].ToString();
        TypeClass = fRow["status"].ToString();
        TypeMsg = fRow["message"].ToString();
        break;
    case "qty":
        QtyOrig = fRow["original"].ToString();
        QtyAdj = fRow["adjusted"].ToString();
        QtyClass = fRow["status"].ToString();
        QtyMsg = fRow["message"].ToString();
        break;
}

これを次のように減らしたいと思います。

switch(fRow["fieldName"].ToString())   
    case "partType": fieldName = "Type";
        break;
    case "qty": fieldName = "Qty";
        break;
}
fieldName + "Orig" = fRow["original"].ToString();
fieldName + "Adj" = fRow["adjusted"].ToString();
fieldName + "Class" = fRow["status"].ToString();
fieldName + "Msg" = fRow["message"].ToString();

追加情報:

  1. データベースのフィールド名にはいくつかの例外があるため、単純にフィールド名を使用することはできず、スイッチを使用する必要があります。
  2. また、データベースのいくつかのフィールドに非標準の文字列を入力する必要があります。
  3. 私は現在 32 のフィールド名を持っていますが、それはさらに増える可能性があるため、コードの長さを減らすことで管理が非常に簡単になります。(@Servy のアプローチにより、19 に減少しました)
  4. 結果の文字列がビューで使用されます。

文字列名を動的に設定して入力するにはどうすればよいですか?

4

3 に答える 3

3

オブジェクトをリファクタリングする必要があります。一連のフィールド/プロパティに同じものを接頭辞として付けている場合は、その種類のデータを表す新しい型を作成する必要があります。

public class Foo //TODO give meaningful name
{
    //I changed the abbreviations to real words.  If I was wrong, please fix, but
    //as a rule try to avoid overuse of abbreviations in variable names; 
    //it makes code harder to read.
    public string Original { get; set; }
    public string Adjacent { get; set; }
    public string Class { get; set; }
    public string Message{ get; set; }
}

最初のタイプに戻ります。

public class MyClass //TODO fix name
{
    public Foo Type {get;set;}
    public Foo Quality {get;set;}
}

同じタイプのオブジェクトが 2 つあるので、オブジェクトを設定してそのオブジェクトを に配置するためのコードを分離できますMyClass

Foo foo = new Foo()
{
    Original = fRow["original"].ToString(),
    Adjacent = fRow["adjusted"].ToString(),
    Class = fRow["status"].ToString(),
    Message= fRow["message"].ToString(),
};

switch(fRow["fieldName"].ToString())
{
    case "partType":
        Type = foo;
        break;
    case "qty":
        Quality = foo;
        break;
}
于 2013-02-09T00:43:28.437 に答える
0

の良い使用例のようですDictionary<string, string>

例えば

Dictionary<string, string> fieldValues = new Dictionary<string, string>();
fieldValues.Add("TypeOrig", string.Empty);
fieldValues.Add("TypeAdj", string.Empty);
fieldValues.Add("TypeClass", string.Empty);
fieldValues.Add("TypeMsg", string.Empty);
fieldValues.Add("QtyOrig", string.Empty);
fieldValues.Add("QtyAdj", string.Empty);
fieldValues.Add("QtyClass", string.Empty);
fieldValues.Add("QtyMsg", string.Empty);

....

switch(fRow["fieldName"].ToString())   
{
    case "partType": fieldName = "Type";
        break;
    case "qty": fieldName = "Qty";
        break;
    default: fieldName = string.Empty;
        break;
}
if(fieldName.Length > 0)
{
    fieldValues[fieldName + "Orig"] = fRow["original"].ToString();
    fieldValues[fieldName + "Adj"] = fRow["adjusted"].ToString();
    fieldValues[fieldName + "Class"] = fRow["status"].ToString();
    fieldValues[fieldName + "Msg"] = fRow["message"].ToString();
}

もちろん、この変更には文字列変数を直接使用するコードの書き直しが必要ですが、多くの利点があります。1 つの変数のみ、新しいキーによる拡張性、よりオブジェクト指向、辞書に適用可能な多くの機能、Linq による拡張性....

于 2013-02-08T23:27:58.483 に答える
0

プロパティのバッキング ストアとしてディクショナリを使用します。

于 2013-02-08T23:32:21.193 に答える