Ранее я уже публиковал свой вопрос здесь , но я не получил никакой причины ответа - я думаю - это слишком общий характер. Я постараюсь быть более кратким.
У меня есть два объекта одного типа, и я хочу отобразить некоторые свойства и исключить другие. Я пытаюсь сохранить объект в кеше и получить его позже, используя только свойства (поля) с определенным атрибутом.
Я посмотрел на Automapper , но я не нашел ничего подходящего для меня, поэтому я подумал реализовать свою собственную систему.
Я создал атрибут:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class FilterFieldAttribute: Attribute
{
}
и украсил им класс на полях, которые мне нужно включить:
public class OrdersViewModel : BaseViewModel
{
...
[FilterField]
[DisplayName("Order Number:")]
public string OrderNumber { get; set; }
[FilterField]
[DisplayName("From date:")]
public DateTime FromDate { get; set; }
[FilterField]
[DisplayName("To date:")]
public DateTime ToDate { get; set; }
[DisplayName("Status:")]
public int Status { get; set; }
...
}
Теперь я реализовал функцию, которая отвечает за отображение:
private T Map<T>(T Source, T Destination) where T : BaseViewModel
{
if (Source == null)
{
return (Source);
}
FilterFieldAttribute filterAttribute;
foreach (PropertyInfo propInfo in typeof(T).GetProperties())
{
foreach (FilterFieldAttribute attr in propInfo.GetCustomAttributes(typeof(FilterFieldAttribute), false))
{
filterAttribute = attr as FilterFieldAttribute;
if (filterAttribute != null)
{
var value = propInfo.GetValue(Source, null);
propInfo.SetValue(Destination, value, null);
}
}
}
return (Destination);
}
Теперь, когда мне нужно извлечь мою модель представления из кэша и заполнить только свойства, отмеченные атрибутом, мой код выглядит следующим образом:
viewModel = Map<T>(myCache.Get(Key) as T, viewModel);
Я не знаю, лучше ли это делать, но, похоже, это единственный способ, который я нашел.
Любое предложение будет оценено.