Я не разработчик.net, и мне нужно назначить 35 значений входам внешнего метода с использованием.net 3.5. Входы метода выглядят примерно так:
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 или все ключевые значения могут отсутствовать. (вся строка может быть нулевой, в приведенном примере только 5).
В настоящее время я использую код ниже 35 раз, чтобы присвоить значения переменным (которые я узнал здесь):
if(diags.TryGetValue(1, out value))
{
proc.x1=diags[1];
}
Но повторение этого кода 35 раз кажется плохим дизайном.
Как только я назначил все входы, внешний код что-то делает в черном ящике:
proc.Calc()
Он возвращает кучу несвязанных значений (правильно).
Есть ли лучший способ достичь этого?
Вы можете использовать отражение, чтобы установить свойства 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();
Вы можете использовать отражение для установки значений. Пример:
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; }
}