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