Что ж, достаточно просто получить все свойства и выяснить, какие из них являются строками и доступны для записи. 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
для построения делегатов для методов получения и установки
- Возможно, использовать деревья выражений, хотя я не уверен, помогут ли они здесь
Я бы не стал предпринимать какие-либо из этих шагов, если бы производительность не была проблемой.