2017-06-05 21 views
1

C#でジェネリック型を使用していましたが、ジェネリック型を初めて使用しました。だから、今は問題が残っています。私はこれらのようないくつかのクラスを持っている:ジェネリック型の宣言方法

public class MyModel1 
{ 
} 

public class MyModel2 
{ 
} 

public class BaseClass<T> 
{ 
} 

public class ChildClass1 : BaseClass<MyModel1> 
{ 
} 

public class ChildClass2 : BaseClass<MyModel2> 
{ 
} 

public class AnotherClass 
{ 
    //What will be the syntax of declaring this method 
    //The syntax of the following method is wrong and incomplete. 
    //It's there just to give an idea about whai i want to do. 
    public void MyMethod<T>() 
     where T : BaseClass<..what to write..> 
    { 

    } 
} 

私の質問は、私はこのようなMyMethodはを呼び出したい場合MyMethodは宣言の正しい構文になりますものです:あなたはリターンを言及するのを忘れてしまった

MyMethod<ChildClass1>(); 
+3

を、あなたは'ここで、Tを意味しましたか?メソッドにも戻り値の型またはvoidがありません。 – Nkosi

+0

編集された戻り値の型。そして、いいえ、それは、 'T:BaseClass 'が私が探しているものではないように見えます。 –

答えて

0

私が正しく理解していれば、Tが "ChildClass ..."のクラスであるように "MyMethod"をフィルタリングしようとします。

あなたはこのようなあなたの関数に一般的なパラメータを追加することができます

public void MyMethod<T, U>() 
where T : BaseClass<U> 
{ 

} 

しかし、その後、あなたはそのようにMyMethodはを呼び出す必要があります。

MyMethod<ChildClass1, MyModel1>(); 

だから、使用するのはかなり複雑です。


別の解決策は、新しい "ブランク" クラスを作成することです:BaseClassの `:

public abstract class Base // mark it as abstract if you don't need to use it in your code 
{ 
} 

public class MyModel1 
{ 
} 

public class MyModel2 
{ 
} 

public class BaseClass<T> : Base //The class inherits the new class 
{ 
} 

public class ChildClass1 : BaseClass<MyModel1> 
{ 
} 

public class ChildClass2 : BaseClass<MyModel2> 
{ 
} 

public class AnotherClass 
{ 
    public void MyMethod<T>() 
    where T : Base 
    { 
    } 
} 
+0

ありがとう。私はまた、バックアップ計画として同じこと(別のベースクラスを作成する)を考えていました。ジェネリック医薬品の保有状況が改善され、より良い解決策が見つかるまでは、今のところこのようにしなければならないと思います。 –

0

クラス名の後ろに<T>を追加します。戻り値の型がvoidの場合たとえば、あなたはとしてメソッドを宣言できます。これは動作します

 public void MyMethod<T>() 
     where T : BaseClass<T> 
{ 

} 
+0

編集された戻り値の型。そして、いいえ、それは、 'T:BaseClass 'が私が探しているものではないように見えます。 –

0

(私はそれがコンパイルを意味していることで)

public void MyMethod<T>() 
    where T : BaseClass<MyModel1> 
{ } 

ので、この処理を行います。

public void MyMethod<T>() 
    where T : ChildClass1 
{ } 

さらに編集...あなたのコメントを読んだ後

あなたはこれを行うことができます。

public class AnotherClass<TBaseClass, TModel> where TBaseClass : BaseClass<TModel> 
{ 
    public void MyMethod(TBaseClass input) 
    { } 
} 

私はうまくいけば、非攻撃的、このための用語を、持っています。私はそれを狂気の一般的なうさぎの穴と呼びます。ジェネリックと継承を組み合わせて、クラスの1つのセットがより複雑になる幅広い目標を達成できるようにすると、より一般的なパラメータとより一般的なクラスを追加することで解決します。 <dynamic>
を使用 - - あなたは
場合

あなたが穴の底に達する実際の型が使用しているかを確認GetType()typeof、またはis
- それはコンパイルするために得るが、それは何を思い出すことができません

+0

はい、動作します。しかし、その後、すべてのMyModel(1番目の方法)またはすべてのChildClasses(2番目の方法)に対してMyMethodを記述する必要があります。だから私は何か一般的なものを探していた。 –

関連する問題