我创建了一个应用程序,允许用户根据我通过Web界面创建的预定义模板捕获实体信息。
因此,例如,我创建了一个模板,并将其称为“客户模板”,其中包含名字,姓氏,电子邮件地址等几个属性,并将“数据类型”与每个属性相关联,而不会严格映射到强类型类型。
当用户随后创建新的“客户”时,将生成具有适当属性/字段的html表单,用户可以提供并保存。
数据类型称为“纯文本”或“数字”或“货币”,但不映射到数据类型。例如,将“数字”与强类型int相关联的最佳方法是什么,以便当我对它进行操作时它是正确的类型?
用户将使用的“类型”数量是有限的,可能少于10.我是否会遇到switch语句的问题?还是有另一种方式?
我用c#。
答案 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));
}
}
要改进这些类,您可以实现Equals
,GetHashCode
,IConvertible
,序列化,验证等。
答案 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的属性。