Я разрабатываю общий класс отражения для отслеживания изменений. То, что у меня есть, отлично подходит для всех классов, которые я пропустил. Я готов переместить его как часть инструмента для всей группы. Я заинтересован в улучшении этого еще немного, прежде чем я буду раскрывать его всем. Он вызывается из методов, которые имеют обработку ошибок на месте, так что часть не является проблемой. Кроме того, это прекрасно работает в нашей логике, как мы сглаживаем объекты для отслеживания изменений, но мне не хватает чего-то, что может быть проблемой, даже если оно отлично работает для обычных ситуаций.Улучшения класса улучшения отслеживания изменений
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 свойств без проблем с производительностью, но я стараюсь избегать таких вещей, когда это возможно.
Благодаря Джимми
Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что он должен быть опубликован на http://codereview.stackexchange.com –
Предоставленный пункт 4 может принадлежать конадзору, но причина этого вопроса - это действительно точки 1 и 2, которые соответствующим образом направлены на SO. Я не знаю, как добавить .Where, чтобы удалить оператор if, потому что он не работает со всем, что я пробовал. – Jimmy
'typeof (S) .GetProperties(). Где (p =>! Excluded.Contains (p.Name))';) - вы действительно должны задать один вопрос на вопрос, хотя (на соответствующих сайтах), иначе вы получите в ситуации, когда у вас есть много частичных ответов. Как вы принимаете правильный ответ, когда у вас есть 4 разных ответа, отвечая на 4 разных вопроса? –