Код: Выделить всё
public interface ICloneable:
ICopyable where T : ICloneable, new()
{
public T CloneTyped ();
}
public interface ICopyable
where T : ICopyable
{
public T CopyTo (T other);
public T CopyFrom (T other);
}
public interface IDirtyable
where T : IDirtyable
{
// Compares the current object [this] to an unaltered object [referenceObject].
public bool IsDirty (T referenceObject);
}
public partial class Model:
ICloneable,
ICopyable,
IDirtyable
{
public virtual long Id { get; set; }
public virtual DateTime DateTimeCreated { get; set; }
public virtual DateTime DateTimeModified { get; set; }
public virtual string Name { get; set; } = string.Empty;
public Model CloneTyped () => new Model().CopyFrom(this);
public Model CopyFrom (Model other) => other.CopyTo(this);
public Model CopyTo (Model other)
{
other.Id = this.Id;
other.DateTimeCreated = this.DateTimeCreated;
other.DateTimeModified = this.DateTimeModified;
other.Name = this.Name;
return (other);
}
public bool IsDirty (Model referenceObject)
{
return
this.Id == referenceObject.Id
&& this.DateTimeCreated == referenceObject.DateTimeCreated
&& this.DateTimeModified == referenceObject.DateTimeModified
&& this.Name == referenceObject.Name;
}
}
Таким образом, у нас остается шаблон интерфейса, который выполняет сравнение или Операция присваивания для двух объектов одного типа. Теперь, поскольку я знаю список свойств, которые должны обрабатываться этими реализациями интерфейса, я мог бы сделать что-то вроде следующего:
Код: Выделить всё
public bool IsDirtyUsingReflection (Model referenceObject)
{
var equal = true;
var propertyNames = new [] { nameof(this.Id), nameof(this.DateTimeCreated), nameof(this.DateTimeModified), nameof(this.Name), };
var properties = this.GetType().GetProperties().Where(p => propertyNames.Contains(p.Name));
foreach (var property in properties)
{
equal
&= property.GetValue(this)
?.Equals(property.GetValue(referenceObject))
?? false;
if (!equal) { return (true); }
}
return (false);
}
Я думал о сохранении такие свойства, как типы выражений.
Код: Выделить всё
var properties = new Expression [] {...};
- Поддерживать статический список свойств.
- Выполнять операции присваивания и сравнения без упаковки.
- Выполнять операции присваивания и сравнения без отражения.
- Поддерживать список объектов Expression или скомпилированных лямбда-выражений, не требующих упаковки. Компиляция и/или упаковка на уровне типа () подходит.
Код: Выделить всё
static1
Подробнее здесь: https://stackoverflow.com/questions/791 ... out-boxing
Мобильная версия