Динамическое изменение других свойств класса с помощью цикла - PullRequest
0 голосов
/ 20 июня 2019

Допустим, strArr - это массив строк.В цикле я разделяю каждый из них, чтобы получить ключ и значение .Все, что я хочу сделать, - это найти свойство в XClass, которое равно key , и установить его в value .

Если элемент strArr не содержит правильного ключа (как, например, 'propertyThree' в примере), свойство в XClass не должно изменяться (поэтому оно становится нулевым).

Пример кода:

string[] strArr = new string[] {
    "propertyOne:valueOne",
    "propertyTwo:valueTwo"
}

class XClass {
    public string propertyOne {get; set;}
    public string propertyTwo {get; set;}
    public string propertyThree {get; set;}
}

-----
XClass instance = new XClass();

for (int i = 0; i < strArr.Length; i++) {
    string[] arr = strArr.Split(':');
    string key = arr[0];
    string value = arr[1];

    instance.key = value;
}

// Later on...

ExampleMethod(instance); // instance's properties

Это вызывает ошибку, поскольку XClass не имеет свойства с именем key.Это очевидно, но я не знаю, как это исправить.

1 Ответ

0 голосов
/ 20 июня 2019

Вы можете использовать метод GetProperty типа instance, чтобы найти свойство, имя которого соответствует строке, а затем вызвать SetValue для этого свойства, чтобы установить значение в экземпляре.

Если свойство name не найдено, GetProperty вернет null, поэтому я использовал оператор ?., чтобы защититься от этого.

Также былопечатка в исходном образце - вы звонили Split на strArr (массив) вместо strArr[i] (строка).

XClass instance = new XClass();

for (int i = 0; i < strArr.Length; i++)
{
    var parts = strArr[i].Split(':');
    if (parts.Length < 2) continue;

    var propName = parts[0];
    var propValue = parts[1];

    instance.GetType().GetProperty(propName)?.SetValue(instance, propValue);
}

Обратите внимание, что этот код будет работать так же, как для образцаВы указали, но propValue должен иметь правильный тип (string в данном случае), чтобы он работал.Поэтому необходимо добавить дополнительную обработку ошибок, чтобы сделать эту работу более обобщенной.

...