Как назначить переменное количество входов?

1

Я не разработчик.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()

Он возвращает кучу несвязанных значений (правильно).

Есть ли лучший способ достичь этого?

  • 6
    Вы можете продолжать использовать словарь, а не использовать переменные, подобные этой
  • 0
    Я думаю, что нам нужно увидеть больше кода. Что вы пытаетесь сделать с этими переменными?
Показать ещё 7 комментариев
Теги:

2 ответа

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();
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; }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню