1

在我正在从事的项目中,我发现了与FOR-CASE结构类似的 C#结构:

foreach (string param in params.Split(';'))
{
    string[] parts = param.Split('=');
    string key = parts[0].Trim().ToLower();
    string value = parts[1].Trim();
    switch (key)
    {
        case "param1": this.param1 = value; break;
        case "param2": this.param2 = value; break;
        case "param3": this.param3 = value; break;
        case "param4": this.param4 = value; break;
        default: break;
    }
}

(变量名称已更改以保护有罪者。)

您将如何实现此代码?

4

7 回答 7

6

我认为您问题中的代码与您链接到的代码不同。...

如果我编写命令行工具,问题中的代码看起来像是我可能会做的事情。

我因为没有看到问题中的代码有什么问题而愚蠢吗?

另一种方法是使用反射来填充参数值变量。我有时也这样做过。

顺便说一句:我曾经用一种脚本语言编写了一个程序,该程序将 switch 作为唯一的流控制机制,并且没有 gosub/return。我程序中的代码的结构有点像你链接的那个。一种指令指针变量上的大规模开关,在每种情况下都会重新分配,并且开关周围几乎是无限循环。它完成了工作。

于 2008-12-02T21:03:01.593 回答
4

我看到你在你的类中已经有多个字段用于保存变量。在这种情况下,你正在做的很好。

否则,您可以使用 1 个 HashTable(也许添加到C# 索引器中作为一个转折点)来保存所有这些,并且您的循环将像这样结束:

foreach (string param in params.Split(';'))
{
    string[] parts = param.Split('=');
    string key = parts[0].Trim().ToLower();
    string value = parts[1].Trim();
    MyHashTable[key] = value;
}

这种方法的问题是你应该只有一种类型的值。例如,如果您的参数列表可以同时包含 string 和 int 类型,它会使代码更加混乱,尤其是您需要执行错误检查和验证等。

我个人会坚持你已经拥有的。

于 2008-12-02T21:12:31.530 回答
3

您可以为此使用反射:

Type t = this.GetType();
foreach (string param in params.Split(';'))
{    
    string[] parts = param.Split('=');    
    string key = parts[0].Trim().ToLower();    
    string value = parts[1].Trim();    

    t.GetProperty(key).SetValue(this, value, null);
}
于 2008-12-02T22:00:30.637 回答
2

值得一提的是,WTF 文章是 WTF,因为它的外部循环完全没有用,正如文章中所指出的 - 直接设置索引变量比循环和测试它更容易,更直接。

于 2008-12-02T22:11:56.603 回答
1

不知道我是否也明白,但听起来你让自己复杂化了。不要重新发明轮子,尽可能多地使用 BCL 类,这些类被证明可以有效地工作并为您节省大量时间。听起来您可以使用某种 Dictionary<,> 以及 Guge 建议的 Reflection 来实现它。

于 2008-12-02T21:15:23.723 回答
0

我实际上认为OP的代码很好。它并不完美——可能有更简单或更简洁的方法来做到这一点,但它有效地允许成员/属性名称和输入参数名称之间的可读映射。它使您的属性成为强类型(与 hashmap/dictionary 解决方案不同,除非您的类的所有属性只有一种类型......)并为您提供一个相当明显的位置来修复或添加映射。

于 2008-12-12T16:13:43.003 回答
-3

或正则表达式:

string parms = "param1=1;param2=2;param3=3";
string[] parmArr = parms.Split(';');        

string parm1 = Regex.Replace(parmArr[0], "param1=", "");
string parm2 = Regex.Replace(parmArr[1], "param2=", "");
string parm3 = Regex.Replace(parmArr[2], "param3=", "");
于 2008-12-02T22:04:10.537 回答