2015-02-07 3 views
0

Я разрабатываю общий класс отражения для отслеживания изменений. То, что у меня есть, отлично подходит для всех классов, которые я пропустил. Я готов переместить его как часть инструмента для всей группы. Я заинтересован в улучшении этого еще немного, прежде чем я буду раскрывать его всем. Он вызывается из методов, которые имеют обработку ошибок на месте, так что часть не является проблемой. Кроме того, это прекрасно работает в нашей логике, как мы сглаживаем объекты для отслеживания изменений, но мне не хватает чего-то, что может быть проблемой, даже если оно отлично работает для обычных ситуаций.Улучшения класса улучшения отслеживания изменений

public class ChangeTracker 
{ 
    public static string GetChangesString<T,S>(T original, T current, S dto, string[] exluded) 
    { 
     StringBuilder sb = new StringBuilder(); 

     PropertyInfo[] names = typeof(S).GetProperties(); 


     string displayName = string.Empty; 
     foreach (PropertyInfo item in names) 
     { 

      if (exluded.Contains(item.Name)) continue; 

      //method that sets display name to either the property name or the display attribute if present 
      displayName = GetDisplayName(item); 

      object propA = original.GetType().GetProperty(item.Name).GetValue(original, null); 
      object propB = current.GetType().GetProperty(item.Name).GetValue(original, null); 

      if (propA == null && propB == null) continue; 

      if (propA == null && propB != null) 
      { 
       //appendline for value added 
      } 
      else if (propB == null && propA != null) 
      { 
       //appendline for value removed 
      } 
      else if (propA.ToString() != propB.ToString()) 
      { 
       //appendline for value changed 
      } 



     } 

     return sb.ToString(); 



    } 

    private static string GetDisplayName(PropertyInfo prop) 
    { 
     string display = string.Empty; 
     //Check for displayattribute and set correct name 
     return display; 
    } 
} 

В частности, это мой вопрос.

Можно ли улучшить настройку propA и propB, чтобы улучшить производительность? Он работает на одном объекте, и я проверил его до 103 свойств без проблем с производительностью, но я стараюсь избегать таких вещей, когда это возможно.

Благодаря Джимми

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что он должен быть опубликован на http://codereview.stackexchange.com –

+0

Предоставленный пункт 4 может принадлежать конадзору, но причина этого вопроса - это действительно точки 1 и 2, которые соответствующим образом направлены на SO. Я не знаю, как добавить .Where, чтобы удалить оператор if, потому что он не работает со всем, что я пробовал. – Jimmy

+2

'typeof (S) .GetProperties(). Где (p =>! Excluded.Contains (p.Name))';) - вы действительно должны задать один вопрос на вопрос, хотя (на соответствующих сайтах), иначе вы получите в ситуации, когда у вас есть много частичных ответов. Как вы принимаете правильный ответ, когда у вас есть 4 разных ответа, отвечая на 4 разных вопроса? –

ответ

1

Вы можете использовать Reflection + Expression Trees комбинацию построить газопоглотитель Func «с. И я рекомендовал строить эти выражения при запуске приложений и кэшировать их (для каждого типа), что должно резко повысить производительность. Но это значительно увеличит ваш размер базы кода =)

+0

Я посмотрю на Деревни Expression. Я не думаю, что это сработает на некоторых из наших старых серверов, но я недостаточно исследовал, чтобы сказать наверняка. Нам не будет разрешено создавать это для запуска приложения и кэшировать его. Иногда производительность идет на обочину из-за предполагаемых рисков безопасности. – Jimmy

+0

На самом деле спасибо за ваш комментарий. Я не думаю, что мой массив. Контейнеры будут работать и на наших старых серверах. – Jimmy

+0

@Jimmy, какую версию каркаса вы используете для разработки? –

Смежные вопросы