我不是.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()
它返回一堆不相关的值(正确)。
有没有更好的方法来实现这一目标?
答案 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; }
}