Определение правильного типа данных по имени - PullRequest
0 голосов
/ 04 июля 2011

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

Так, например, я создаю шаблон и называю его «Шаблон клиента» с несколькими свойствами, такими как Имя, Фамилия, Адрес электронной почты, и связываю «тип данных» с каждым свойством, которое строго не сопоставляется сстрого типизированный тип.

Когда пользователь создает нового «Клиента», генерируется HTML-форма с соответствующими свойствами / полями, которые пользователь может предоставить и сохранить.

Типы данных называются «Обычный текст» или «Число» или «Валюта», но не соответствуют типу данных.Как лучше всего связать, например, «число» со строго типизированным типом int, чтобы при выполнении операций над ним это был правильный тип?

Количество "типов", которые будут использовать пользователи, конечно, может быть меньше 10. Могу ли я столкнуться с проблемами с оператором switch?Или есть другой способ?

Я использую c #.

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Я бы использовал пользовательские атрибуты для определения типа CLR, сопоставленного с вашими типами форм следующим образом:

public enum FieldDataTypes 
{
    [FormTypeMetadata(typeof(string))]
    PlainText = 0, 
    [FormTypeMetadata(typeof(int))]
    Number = 1,
    [FormTypeMetadata(typeof(decimal))]
    Currency = 2
}

public class FormTypeMetadataAttribute : Attribute
{
    private readonly Type _baseType = typeof(object);
    public FormTypeMetadataAttribute(Type baseType)
    {
        if (baseType == null) throw new ArgumentNullException("baseType");
        _baseType = baseType;
    }

    public Type BaseType { get { return _baseType; } }
}

// your 'FieldData' implementation would look like this...

public class FieldData
{
    public FieldDataTypes FieldType { get; set; }

    public object Value { get; set; }
}

Вы можете получить атрибут FieldDataTypes с помощью отражения.

1 голос
/ 04 июля 2011

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

Вот простой пример, где родительский класс является универсальным.Отдельное определение интерфейса включено для случаев, когда аргумент универсального типа T изменяется или неизвестен:

public interface IFormDataType
{
    object Value { get; }

    Type PrimitiveType { get; }

    string Format();
}

public abstract class FormDataType<T> : IFormDataType
{
    object IFormDataType.Value { get { return Value; } }
    public Type PrimitiveType { get { return typeof(T); } }
    public T Value { get; private set; }

    public FormDataType(T value)
    {
        Value = value;
    }

    public abstract string Format();

    public override string ToString()
    {
        return Format();
    }
}

public class Currency : FormDataType<decimal>
{
    public Currency(decimal value)
        : base(value)
    {
        //perform any validation if necessary
    }

    public override string Format()
    {
        return Value.ToString("C");
    }

    public static Currency Parse(string s)
    {
        return new Currency(decimal.Parse(s, NumberStyles.Currency));
    }
}

Чтобы улучшить эти классы, вы можете реализовать Equals, GetHashCode, IConvertible,сериализация, проверка и т. д.

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