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();
附加信息:
- 数据库中的字段名有一些例外,所以我不能简单地使用字段名,而必须使用开关
- 我还必须为数据库中的几个字段填充一些非标准字符串
- 我目前有32个字段名称,而且可以增长,因此减少代码长度将使其更容易管理。(@Servy的方法将其减少到19)
- 生成的字符串将在视图中使用
如何动态设置字符串名称并填充它?
您应该重构对象。每当你看到自己用相同的东西在一堆字段/属性前加上前缀时,你应该创建一个新的类型来表示这种数据。
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的可扩展。。。。