Присвоение и сравнение свойств класса без упаковкиC#

Место общения программистов C#
Ответить
Anonymous
 Присвоение и сравнение свойств класса без упаковки

Сообщение Anonymous »

Рассмотрим следующий сценарий:

Код: Выделить всё

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;
}
}
Обратите внимание, что для ответа на этот вопрос меня не интересует INotifyPropertyChanged или другие подобные механизмы. Кроме того, предположим, что класс Model имеет десятки скалярных свойств (составные типы нас не интересуют).
Таким образом, у нас остается шаблон интерфейса, который выполняет сравнение или Операция присваивания для двух объектов одного типа. Теперь, поскольку я знаю список свойств, которые должны обрабатываться этими реализациями интерфейса, я мог бы сделать что-то вроде следующего:

Код: Выделить всё

    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 или скомпилированных лямбда-выражений, не требующих упаковки. Компиляция и/или упаковка на уровне типа () подходит.
Типы данных, которые следует учитывать, включают только встроенные типы значений, строки, перечисления и структуры, реализующие IEquitable. .

Подробнее здесь: https://stackoverflow.com/questions/791 ... out-boxing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»