У меня есть несколько больших объектов, которые у каждого есть приблизительно 60 строк. Я должен обрезать все те строки, и я хотел бы сделать так, не имея необходимость идти this.mystring = this.mystring. Обрезка (). Вместо этого я ищу способ автоматически иметь каждый объект, обнаруживают его собственные строки и затем выполняют операцию.
Я знаю немного об отражении, но недостаточно, но я думаю, что это возможно?
Кроме того, я не уверен, имеет ли это значение, но некоторые свойства строки только для чтения (только имеют метод считывания), таким образом, те свойства должны были бы быть пропущены.
Помощь?
Достаточно легко получить все свойства и выяснить, какие из них являются строками и доступны для записи. 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
для создания делегатов для геттеров и сеттеров Я бы не стал предпринимать какие-либо из этих шагов, если производительность на самом деле не является проблемой.
Что-то вроде:
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);
}
}