Упорядоченный список свойств C #, для обычных операций? - PullRequest
2 голосов
/ 16 марта 2011

Фон: у меня есть форма ViewModel с 7 свойствами, каждый ViewModel представляет разделы мастера, и все реализуют IFormSection.Я пытаюсь использовать одно определение (то есть DRY / SPoT) для этих моделей представления между многосекционными клиентами AJAX и односекционными клиентами с отключенным JavaScript.

Важно, чтобы они были доступны в качестве свойств, чтобы автоматизироватьработает сериализация / десериализация (т. е. привязка модели ASP.NET MVC), и эти свойства также должны быть индивидуально обнуляемыми, чтобы указывать неподтвержденные разделы.

Но у меня также есть 6-10 случаев для итерации этих сериализуемых свойствс общими операциями IFormSection, в некоторых случаях упорядоченным образом.Итак, как я могу сохранить этот список свойств для повторного использования? РЕДАКТИРОВАТЬ: Это включает в себя пакет new() их загрузки в операции полной загрузки.

Например, может быть, конечный результат выглядит примерно так:

interface IFormSection {
    void Load();
    void Save();
    bool Validate();
    IFormSection GetNextSection(); // It's ok if this has to be done via ISectionManager
    string DisplayName; // e.g. "Contact Information"
    string AssociatedViewModelName; // e.g. "ContactInformation"
}
interface ISectionManager {
    void LoadAllSections(); // EDIT: added this to clarify a desired use.
    IFormSection GetRequestedSection(string name); // Users can navigate to a specific section
    List<IFormSection> GetSections(bool? ValidityFilter = null);
    // I'd use the above List to get the first invalid section
    // (since a new user cannot proceed past an invalid section),
    // also to get a list of sections to call .Save on,
    // also to .Load and render all sections.
}
interface IFormTopLevel {
    // Bindable properties
    IFormSection ProfileContactInformation { get; set; }
    IFormSection Page2 { get; set; }
    IFormSection Page3 { get; set; }
    IFormSection Page4 { get; set; }
    IFormSection Page5 { get; set; }
    IFormSection Page6 { get; set; }
    IFormSection Page7 { get; set; }
}

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

Помощь?

ps Я согласен, я могу упускать из виду гораздо более простую схему с участием делегатов или что-то в этом роде.Я также понимаю, что у меня есть проблемы с SoC, не все из которых являются результатом обобщения проблемы для StackOverflow.

1 Ответ

1 голос
/ 16 марта 2011

Если порядок постоянен, вы можете иметь свойство или метод, возвращающий IEnumerable<object>; затем yield возвращает каждое значение свойства ... или IEnumerable<Tuple<string,object>> ..., которое вы можете повторить позже.

Что-то супер простое, как:

private IEnumerable<Tuple<string,object>> GetProps1()
{
   yield return Tuple.Create("Property1", Property1);
   yield return Tuple.Create("Property2", Property2);
   yield return Tuple.Create("Property3", Property3);
}

если вы хотите, чтобы более общий подход делал то же самое, вы можете использовать рефлексию:

private IEnumerable<Tuple<string,object>> GetProps2(){
   var properties = this.GetType().GetProperties();
   return properties.Select(p=>Tuple.Create(p.Name, p.GetValue(this, null)));
}

или, ИДК? может быть метод расширения?

private static IEnumerable<Tuple<string,object>> GetProps3(this object obj){
   var properties = obj.GetType().GetProperties();
   return properties.Select(p=>Tuple.Create(p.Name, p.GetValue(obj, null)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...