asp.net mvc-创建动态字符串名称并在C#中设置值

本文关键字:设置 mvc- net 创建 动态 字符串 asp | 更新日期: 2023-09-27 17:58:19

我有一个字符串列表,比如:

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. 生成的字符串将在视图中使用

如何动态设置字符串名称并填充它?

asp.net mvc-创建动态字符串名称并在C#中设置值

您应该重构对象。每当你看到自己用相同的东西在一堆字段/属性前加上前缀时,你应该创建一个新的类型来表示这种数据。

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;
}

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

似乎是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的可扩展。。。。