Как лучше всего представлять поля формы в C # - PullRequest
0 голосов
/ 28 июня 2011

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

Я собираюсь позволить пользователю создавать несколько «учетных записей» на телефоне - каждая представляет собой набор данных для входа в систему для определенного сайта. Например, если бы я использовал в качестве примера stackoverflow, у меня был бы класс:

public abstract class MyBaseClass
{
    public Dictionary<string, string> fields;
}

public class StackOverflow : MyBaseClass 
{
   public StackOverflow()
   {
       fields.Add("Username", "Default Username");
       fields.Add("Password", "");
   }
}

Класс сделает всю работу, я хочу, чтобы люди могли отправлять новые классы для включения в более поздние выпуски.

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

Использование словаря казалось нормальным для начала, но я не думал о том, как представить тип данных - я хочу определить, должен ли ввод быть текстом, числом или паролем.

Как мне лучше включить эти данные?

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Учитывая, что скрининг экрана в лучшем случае плох, а в худшем - катастрофический, я должен порекомендовать вам включать только те сайты (или сервеки), которые предоставляют общедоступный документированный API, а затем использовать эту ссылку для определения типов данных, которые вы храните.

Тем не менее, если вы находитесь на C # /. NET 4, вы можете использовать тип данных Tuple .

1 голос
/ 28 июня 2011

С этим шаблоном следует помнить, что почти все, что вы делаете с этим объектом, основано на «магической струне». Строковых данных очень мало, что можно проверить во время компиляции; имя поля, на которое ссылаются как на строку, может иметь орфографическую ошибку, которая будет немедленно обнаружена компилятором; Точно так же, установка «ABC123» в качестве поля, которое должно быть десятичным, просто подойдет, пока вы не попытаетесь разобрать его.

Если вы решили пойти по этому пути, я бы изменил Словарь на Список пользовательских классов, которые содержали все метаданные поля; его имя, его тип, текущее значение и т. д. Список должен быть защищен и доступен через один или несколько индексаторов класса, производного от вашего класса MyBaseClass, который может извлекать данные на основе позиции индекса ИЛИ по имени поля в качестве ситуация может потребовать.

Помните, что при переходе к списку наивная реализация приведет к линейному времени поиска для поля, а словарь дает вам логарифмическое время доступа. Вы можете уменьшить это, отсортировав список и реализовав BinarySearch для поиска имен полей.

0 голосов
/ 28 июня 2011

Вы должны будете создать свою собственную модель, чтобы представить это.Просто делай то, что естественно и имеет смысл.Как насчет этого:

public enum InputType
{
    Text,
    Number,
    Password
}

public class Value
{
    public object Value { get; set;}
    public InputType InputType { get; set;}
}

public abstract class MyBaseClass
{
    public Dictionary<string, Value> fields;
}

public class StackOverflow : MyBaseClass 
{
   public StackOverflow()
   {
       fields.Add("Username", new Value() {
           Value = "Default Username",
           InputType = InputType.Text
       });
       fields.Add("Password", new Value() {
           Value = "hw78fksm9",
           InputType = InputType.Password
       });
   }
}

Кстати, не делайте переменную fields из MyBaseClass общедоступной, это деталь реализации и должна быть скрыта / инкапсулирована!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...