2011-07-04 5 views
0

私は、ユーザーがWebインターフェイスを通じて作成した定義済みのテンプレートに基づいてエンティティの情報を取得できるようにするアプリケーションを作成しました。名前から正しいデータ型を特定する

たとえば、テンプレートを作成して、名前、姓、電子メールアドレスなどのいくつかのプロパティを持つ「顧客テンプレート」と呼んでいます。厳密に厳密にマップしない各プロパティに「データ型」を関連付けます型付きタイプ。

ユーザーは、新しい「顧客」を作成すると、HTMLフォームは、ユーザーが提供して保存することができ、適切なプロパティ/フィールドで生成されます。

データ型は「プレーンテキスト」または「数値」または「通貨」と呼ばれますが、データ型にはマッピングされません。たとえば、厳密に型指定されたintに「数値」を関連付けるのに最適な方法は何でしょうか。

ユーザーが使用する「種類」の数は、おそらく10未満は、私はswitch文の問題に実行するだろう、有限でありますか?それとも別の方法がありますか?

私はC#を使用しています。 FormDataTypeのような一般的な抽象親クラスから派生するクラスとしてそれぞれを定義していない理由を

答えて

1

を実装するかもしれません

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'属性を取得することができます。私は、カスタムのようなフォームタイプにマッピングされたCLR型を識別するために属性を使用します。

+0

これはきちんとした解決策のようです。そして、enumをJSONにシリアル化できるようです。 – fr3dr1k8009

1

あなたのデータ型のすべてのカスタムタイプを使用している場合は、。親クラス等、

を派生クラスで検証を扱うことができる一方で、このようなプリミティブデータタイプの関連付けなど、いくつかの便利なメソッドを公開フォーマットすることができここで親クラスが一般的であり、簡単な例を示します。別のインタフェース定義がジェネリック型引数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、直列化、検証、など