C#の列挙型のベースオブジェクトはありますか?
-
20-09-2019 - |
質問
私はそれを実装するクラスは、プロパティのためにいくつかの型の列挙型を返さなければならないことを定義したい私の基本クラスのようあなたは、列挙型と継承を使用することはできませんことを知っています。
理想的には、これは次のようになります
public abstract BaseEnum MyEnum { get; set; }
その後、すべての実装は、列挙型のいくつかのフォームを返すために必要があります。しかし、明らかにBaseEnumは存在しません。私は、オブジェクトを使用できますが、私はむしろないと思います。
これを行うための良い方法はありますか?
の編集を、私は基本的に同じ実装クラスでプロパティの名前を維持したいので、私はこれを求めている - 私は列挙型で作業することができませんことを知っています私はベースに入れていなかった場合は、基本クラスは、しかし、その実装クラスは、独自の実装に向けてドリフトと同じように、時間をかけて不明瞭になる可能性があり、その列挙型、のために独自のプロパティ名を決定することができます。
解決
あなたは簡単にC#で来ることができる最も近い構造体の制約を持つジェネリック型を作ることです。
public abstract class BaseClass<T> where T : struct
{
public abstract T MyEnum { get; set; }
}
そして
public class DerivedClass : BaseClass<SomeEnum>
のC#を使用すると、CLIがそれをサポートしていても、あなたはタイプを列挙する制限、制約を指定できません。私はそのような制約を強制するビルド後のトリックを使用しています制約のないメロディすると呼ばれるプロジェクトを持っています - 私はあなたがやや大胆な感じている場合を除き、あなたが同じアプローチを取ることをお勧めしません。構造体の制約は、少なくとも十分とすることができる、値の型にあなたを制限されます。
他のヒント
すべての列挙型は、System.Enumから継承されます。
あなたがここで見てみる必要があります:列挙「継承」するます:
See section 8.5.2 of the CLI spec for the full details. Relevant information from the spec * All enums must derive from System.Enum * Because of the above, all enums are value types and hence sealed