Выполните итерации через собственные Строки Объекта и Trim каждого

У меня есть несколько больших объектов, которые у каждого есть приблизительно 60 строк. Я должен обрезать все те строки, и я хотел бы сделать так, не имея необходимость идти this.mystring = this.mystring. Обрезка (). Вместо этого я ищу способ автоматически иметь каждый объект, обнаруживают его собственные строки и затем выполняют операцию.

Я знаю немного об отражении, но недостаточно, но я думаю, что это возможно?

Кроме того, я не уверен, имеет ли это значение, но некоторые свойства строки только для чтения (только имеют метод считывания), таким образом, те свойства должны были бы быть пропущены.

Помощь?

11
задан Alex 11 July 2010 в 07:46
поделиться

2 ответа

Достаточно легко получить все свойства и выяснить, какие из них являются строками и доступны для записи. LINQ делает это еще проще.

var props = instance.GetType()
                    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                    // Ignore non-string properties
                    .Where(prop => prop.PropertyType == typeof(string))
                    // Ignore indexers
                    .Where(prop => prop.GetIndexParameters().Length == 0)
                    // Must be both readable and writable
                    .Where(prop => prop.CanWrite && prop.CanRead);

foreach (PropertyInfo prop in props)
{
    string value = (string) prop.GetValue(instance, null);
    if (value != null)
    {
        value = value.Trim();
        prop.SetValue(instance, value, null);
    }
}

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

Существуют различные способы повышения производительности, если это необходимо - например:

  • Простое кэширование соответствующих свойств для каждого типа
  • Использование Delegate.CreateDelegate для создания делегатов для геттеров и сеттеров
  • Возможно использование деревьев выражений, хотя я не уверен, помогут ли они здесь

Я бы не стал предпринимать какие-либо из этих шагов, если производительность на самом деле не является проблемой.

15
ответ дан 3 December 2019 в 06:20
поделиться

Что-то вроде:

    foreach (PropertyInfo prop in obj.GetType().GetProperties(
        BindingFlags.Instance | BindingFlags.Public))
    {
        if (prop.CanRead && prop.CanWrite && prop.PropertyType == typeof(string)
            && (prop.GetIndexParameters().Length == 0)) // watch for indexers!
        {
            var s = (string)prop.GetValue(obj, null);
            if (!string.IsNullOrEmpty(s)) s = s.Trim();
            prop.SetValue(obj, s, null);
        }
    }
3
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: