2017-05-13 6 views
0

スレッドのタイトルが正確である場合は肯定的ではありません。"generic" Enumをパラメータとして受け取り、実行時にdiff列挙型にキャストするメソッド

私は別の列挙型のクラスを持っている:

public class Enums 
{ 
    public enum StringActions 
    { 
     FIRSTNAME, 
     MIDDLEINITIAL, 
     LASTNAME 
    } 

    public enum IntegerAction 
    { 
     RANGE, 
     RANDOM 
    } 
} 

私は、コンストラクタのオブジェクトを持って、私はStringActionまたはIntegerActionのいずれかを受け入れることができるだろうこれ、ジェネリック列挙型パラメータに取るしたいと思います。これらの列挙型をキーとして持つディクショナリ(各列挙型ごとに1つずつ)と値としてデリゲートがあります。私は渡された列挙型を使用して、その列挙型の正しいデリゲートを検索してから、いくつかの作業を行いたいと思います。

この実装では、「mAction」を正しい型にキャストする必要がありますが、これを実行時にどのように達成できますか?反射はここにあるのですか、それとも別の方法ですか?

+1

'IF(:出力を行うよう

​​

mAumptionはEnums.StringActionです) ' –

+1

これは何がポイントですか?なぜ、それぞれの型に対して 'DataPoint()'のオーバーロードがありますか?そうすれば、実行時に型をチェックする必要はありません。コンパイラはすべての重い作業を行います。それがあなたのケースではうまくいかない場合は、そのことについてもっと明確にする必要があります。コンテキストと制約を明確に示す良い[mcve]を提供し、試したことと具体的に何が問題になっているのかを正確に説明します。 –

+1

可能であれば、メソッドのオーバーロードが優先されます(下の回答者1人は、その回答を反映するために十分に同意しています)。マークされた複製は、他の多くのものと同様にそのアプローチを示しています。 IMHOでは、「動的」を使用するオプションは、次に直線的な過負荷に適しています。依然として宣言しなければならないオーバーロードが使用されますが、オーバーロードの解決はコンパイル時ではなく実行時に処理されます。あなたのケースでそれらのどちらも動作しない場合は、他の選択肢がたくさんあります。 –

答えて

1

それぞれが異なるenumを取る2つのコンストラクタを提供するほうが理にかなっています。しかし、あなたが本当に一般的な実装を提供したい、場合は、

public class DataPoint 
{ 
    public DataPoint(Enums.StringAction mAction) 
    { 
     DoSomeWorkWithStringAction(mAction);       
    } 
    public DataPoint(Enums.IntegerAction mAction) 
    { 
     DoSomeWorkWithIntegerAction(mAction); 
    } 

    // Rest of class omitted 

あなたは、渡されたEnumの種類をチェックするためにisキーワードを使用することができ、その後、これはあなたのコードをより意図的と消費者のために理解することが容易になりますifブロック内の適切なタイプにキャストして使用できます。このコンストラクタが条件を持たないものを含む古いEnumを受け入れることを認識してください。例えば

:いずれの場合も

public class DataPoint 
{ 
    public DataPoint(Enum mAction) 
    { 
     if (mAction is Enums.StringAction) 
     { 
      DoSomeWorkWithStringAction((Enums.StringAction)mAction); 
     } 
     else if (mAction is Enums.IntegerAction) 
     { 
      DoSomeWorkWithIntegerAction((Enums.IntegerAction)mAction); 
     } 
    } 

    private void DoSomeWorkWithIntegerAction(Enums.IntegerAction actionToTake) 
    { 
     Console.WriteLine($"Enum was an IntegerAction, with action: {actionToTake}"); 
    } 

    private void DoSomeWorkWithStringAction(Enums.StringAction actionToTake) 
    { 
     Console.WriteLine($"Enum was a StringAction, with action: {actionToTake}"); 
    } 
} 

は、クラスのインスタンスが同じになります

enter image description here

+0

私の目を開けていただきありがとうございます。オーバーロードされたコンストラクタのアイデアが私に最初に来なかった理由はわかりません。 –

関連する問題