これは私のモデルクラスで、ゾンビまたは人間のタイプがあります。
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public Type Type { get; set; }
public List<Wepon> WeposInList { get; set; }
}
public enum Type
{ [Description("Zombie")] Zombie,
[Description("Human")] Human
}
現在、Intにデータを保存しています
intではなくHumanとZombieとしてデータを保存したい
私が覚えている限り、この問題が発生しました。正直なところ、MSがこの機能を追加しなかった理由はわかりません(NHはいつものようにそれを行うことができます)。
とにかく、私が通常行ったことは、次のようなconst文字列クラスを使用することです。
public static class MyEnum
{
public const string Foo = "Foo";
public const string Bar = "Bar";
}
public class Client
{
public string MyVal { get; set; }
public Client()
{
MyVal = MyEnum.Bar;
}
}
短所-できるだけ単純です。
欠点-型チェックが緩んでいます(プログラムで強制することもできますが)。
そこで今回はもっと野心的なことを考えてみました。そこで、ブライアンが説明した概念を採用しました(たとえば、特定の列挙型がドメイン全体で広く使用されている場合、いくつかの欠点があります)。そしてまあ..私は次の作業をしました:
値を格納するための基本コンポーネントクラス:
[ComplexType]
public class DbEnum<TEnum>
{
public string _ { get; set; }
public DbEnum()
{
_ = default(TEnum).ToString();
}
protected DbEnum(TEnum value)
{
_ = value.ToString();
}
public TEnum ToEnum()
{
return _.ToEnum<TEnum>();
}
public static implicit operator DbEnum<TEnum>(TEnum value)
{
return new DbEnum<TEnum>(value);
}
public static implicit operator TEnum(DbEnum<TEnum> value)
{
return value.ToEnum();
}
}
...基本的にはこれで十分です..EFがジェネリック型をサポートしていないことを除いて...
これは、すべての列挙型に対して、次のようなものが必要であることを意味します...
public enum PrivacyLevel
{
Public,
Friends,
Private
}
public class PrivacyLevelEnum : DbEnum<PrivacyLevel>
{
public PrivacyLevelEnum() : this(default (PrivacyLevel))
{
}
public PrivacyLevelEnum(PrivacyLevel value) : base(value)
{
}
public static implicit operator PrivacyLevelEnum(PrivacyLevel value)
{
return new PrivacyLevelEnum(value);
}
public static implicit operator PrivacyLevel(PrivacyLevelEnum value)
{
return value.ToEnum();
}
}
これにより、たとえばT4テンプレートを使用して簡単に生成できるボイラープレートが得られます。
最終的には次のものを使用することになります。
public class CalendarEntry : Entity
{
public virtual PrivacyLevelEnum PrivacyLevel { get; set; } = new PrivacyLevelEnum();
}
ただし、暗黙的な変換が行われているため、ヘルパー型を認識できるのはクラス宣言だけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加