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

C# 从名称确定正确的数据类型,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我创建了一个应用程序,允许用户根据预定义的模板捕获实体的信息,我通过web界面创建了该模板 因此,例如,我创建了一个模板,并将其称为“客户模板”,其中包含几个属性,如名字、姓氏、电子邮件地址,我将“数据类型”与每个属性关联,而这些属性并不严格映射为强类型 当用户创建一个新的“客户”时,会生成一个带有适当属性/字段的html表单,用户可以提供并保存这些属性/字段 数据类型称为“纯文本”或“数字”或“货币”,但不映射到数据类型。例如,将一个“数字”与一个强类型int相关联的最佳方法是什么,这样当我对

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

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

当用户创建一个新的“客户”时,会生成一个带有适当属性/字段的html表单,用户可以提供并保存这些属性/字段

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

用户将使用的“类型”的数量是有限的,可能少于10个。我会在switch语句中遇到问题吗?还是有别的办法


我使用c#。

如果您对所有数据类型都使用自定义类型,为什么不将每个类型定义为一个派生自常见抽象父类的类,如
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));
    }
}
公共接口数据类型
{
对象值{get;}
类型原语类型{get;}
字符串格式();
}
公共抽象类FormDataType:IFormDataType
{
对象数据类型.Value{get{return Value;}}
公共类型原语类型{get{return typeof(T);}
公共T值{get;私有集;}
公共表单数据类型(T值)
{
价值=价值;
}
公共抽象字符串格式();
公共重写字符串ToString()
{
返回格式();
}
}
公共类货币:FormDataType
{
公共货币(十进制值)
:基准(值)
{
//如有必要,执行任何验证
}
公共重写字符串格式()
{
返回值。ToString(“C”);
}
公共静态货币分析(字符串s)
{
返回新货币(decimal.Parse(s,NumberStyles.Currency));
}
}

为了改进这些类,您可以实现
Equals
GetHashCode
IConvertible
、序列化、验证等。我将使用自定义属性来标识映射到表单类型的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的属性

这看起来是个不错的解决方案。看起来枚举可以序列化为JSON。