如何分配可变数量的输入?

时间:2014-06-10 13:26:51

标签: c# .net

我不是.net开发人员,我需要使用.net 3.5为外部方法的输入分配35个值。方法输入看起来像这样:

proc.x1 = "ABC"
proc.x2 = "DEF"
...
proc.x35 = "ZZZ"

我通过将分隔的字符串解析为字典来获取我需要分配的值,每个子字符串的序号位置作为我的键值。

string proccode = "9052   9|9605   9|966    9|9607   9|4311   9";
foreach (string xProc in proccode.Split('|'))
{ 
    procs.Add(iProc, xProc.Substring(0, 7) + "Y");    
    Console.WriteLine(aProc + " " + iProc);
    aProc = aProc + xProc.Substring(0, 7);
    iProc = iProc + 1;
}

可能不存在1个或所有键值。 (整个字符串可以为null;上面的例子只有5)。

我目前正在使用以下代码35次将值分配给变量(我学习了here):

if(diags.TryGetValue(1, out value))
{
    proc.x1=diags[1];
}

但重复这段代码35次似乎很糟糕。

一旦我分配了所有输入,外部代码就会在黑匣子中执行操作:

proc.Calc()

它返回一堆不相关的值(正确)。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以使用反射单循环中设置x1..x35属性(或字段)

  Dictionary<int, String> diags = ...;

  Type tp = proc.GetType();

  foreach (var pair in diags) {
    // if p1..p30 are fields use FieldInfo instead of PropertyInfo
    // FieldInfo pi = tp.GetField("x" + pair.Key.ToString());
    PropertyInfo pi = tp.GetProperty("x" + pair.Key.ToString());

    if (!Object.ReferenceEquals(null, pi))
      pi.SetValue(proc, pair.Value);
  }

  proc.Calc();

答案 1 :(得分:2)

您可以使用反射来设置值。 例如:

void Main()
{
    var dic = new Dictionary<int, string>()
    { 
        { 1, "Arne" },
        { 2, "Kalle" }
    };

    var t = new Test();
    var props = typeof(Test).GetProperties(BindingFlags.Instance | BindingFlags.Public);
    foreach (var p in props)
    {
        var key = int.Parse(p.Name.Substring(1));
        string value;
        if(dic.TryGetValue(key, out value))
        {
            p.SetValue(t, value);
        }
    }
}

public class Test
{
    public string x1 { get; set; }
    public string x2 { get; set; }
}