从名称确定正确的数据类型

时间:2011-07-04 16:07:07

标签: c# asp.net-mvc-3

我创建了一个应用程序,允许用户根据我通过Web界面创建的预定义模板捕获实体信息。

因此,例如,我创建了一个模板,并将其称为“客户模板”,其中包含名字,姓氏,电子邮件地址等几个属性,并将“数据类型”与每个属性相关联,而不会严格映射到强类型类型。

当用户随后创建新的“客户”时,将生成具有适当属性/字段的html表单,用户可以提供并保存。

数据类型称为“纯文本”或“数字”或“货币”,但不映射到数据类型。例如,将“数字”与强类型int相关联的最佳方法是什么,以便当我对它进行操作时它是正确的类型?

用户将使用的“类型”数量是有限的,可能少于10.我是否会遇到switch语句的问题?还是有另一种方式?

我用c#。

2 个答案:

答案 0 :(得分:1)

如果您对所有数据类型使用自定义类型,为什么不将每个类型定义为派生自公共抽象父类(如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));
    }
}

要改进这些类,您可以实现EqualsGetHashCodeIConvertible,序列化,验证等。

答案 1 :(得分:1)

我会使用自定义属性来识别映射到表单类型的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的属性。