2017-11-15 6 views
-1

ユーザーが質問に対する回答を変更したときに、理由の集合から理由を指定し、選択した理由に応じて、私は特定のサブクラスを作成したい。だから、ChangeReasonクラスで作成する型を保持したいと思います。Typeをパラメータとして使用する方法コンパイル時に基本クラスに制限する

public class ChangeReason 
{ 
    Type _TypeToCreate;  

    public void SetQuestionType(Type value) 
    { 
     if (!value.IsSubclassOf(typeof(BaseAnsweredQuestion))) 
      throw new InvalidOperationException("Invalid Type"); 

     _TypeToCreate = value; 
    } 
} 

は、おそらく一般的な方法を使用して、コンパイル時にタイプを制限する方法はあります:私はタイプが実行時に正しく指定されていることを確認し、このようにそれを行うことができますか?私はこれを次のように呼んでいます:

var reason = new ChangeReason(); 
reason.SetQuestionType(typeof(AnsweredQuestion)); 
+0

これは、簡単に "C#はジェネリック型を制限する" グーグルで答えている... [MSDNを参照してください。記事](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters) –

+0

downvoteによって失望し、グリップに到達しようとする障壁を打った後ジェネリックで私は手を差し伸べていた助けを求めて、私は誰もがこの質問が「ひどく駄目で無駄に費やされた郵便」と言えると思っているのに驚いています。 https://stackoverflow.com/help/privileges/vote-down – Colin

答えて

3

一般的なメソッド定義には、タイプのプレースホルダがあります。 <T>。これは型パラメータまたは引数です。 メソッドの型を安全にする方法であり、メソッドの内部から型引数にアクセスできます。したがって、型をメソッドの引数として渡す必要はありません。

汎用メソッドは、制約:where T : <base class name>を追加することによって、指定された基本クラスまたはその基本クラスの派生クラスに限定することができます。

基本クラスが抽象クラスである場合、new()制約を追加すると、使用されている基本タイプも妨げられます。

public void SetQuestionType<T>() where T: BaseAnsweredQuestion, new() 
{ 
    _TypeToCreate = typeof(T); 
} 

そして、あなたは使用してそれを呼び出すことができます。

reason.SetQuestionType<AnsweredQuestion>(); 

の代わり:

reason.SetQuestionType(typeof(AnsweredQuestion)); 
関連する問題