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. db中的字段名有一些例外,所以我不能简单地使用字段名而必须使用开关。
  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;}
}

现在我们有两个相同类型的对象,我们可以分离出填充对象并将该对象放入的代码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();
}

当然,这种变化需要重写直接使用字符串变量的代码,但它有很多优点。只有一个变量,新键的可扩展性,更面向对象,许多适用于字典的功能,Linq 的可扩展性......

于 2013-02-08T23:27:58.483 回答
0

使用字典作为属性的后备存储。

于 2013-02-08T23:32:21.193 回答