私は主にJavaプログラマーなので、これは "Javaと同等のものは何ですか?"という質問です。だから、Javaで、あなたはそうのような、特定のスーパークラスを拡張するために、コンパイル時でクラスの型引数を抑制することができます。タイプインスタンスが特定のクラスから割り当て可能なタイプを表していることを確認してください
public <T extends BaseClass> void foo(Class<T> type) {
...
}
とさえ
public <T extends BaseClass> T foo(Class<T> type) {
...
}
をあなたも複数のインタフェースをチェーンすることができます:
public <T extends BaseClass & BaseInterface1 & BaseInterface2> void foo(Class<T> type) {
...
}
これはどのようにC#で行われますか?私はあなたが "どこにT:BaseClass"を使うことができるのか知っていますが、これはインスタンスTを持っているときのみ適用できます。
編集:ここでの説明については、
は私がやりたいものです。
ASSEMBLY#1(のBase.dll):
abstract class BaseClass {
abstract void Foo();
}
ASSEMBLY#2(sub1.dll、参照用のBase.dll):
class SubClass1 : BaseClass {
void Foo() {
// some code
}
}
ASSEMBLY#3(sub2.dll、参照はのBase.dll):
class SubClass2 : BaseClass {
void Foo() {
// some other code
}
}
ASSEMBLY#4(MAIN.DLL、参照はのBase.dll):
class BaseClassUtil {
static void CallFoo(Type<T> type) where T : BaseClass {
T instance = (T)Activator.CreateInstance(type);
instance.Foo();
}
}
public static void Main(String[] args) {
// Here I use 'args' to get a class type,
// possibly loading it dynamically from a DLL
Type<? : BaseClass> type = LoadFromDll(args); // Loaded from DLL
BaseClassUtil.CallFoo(type);
}
ので、この例では、私は 'タイプ' 変数が何を表すか、クラスを気にしない限り、それはBaseClassから派生しているので、インスタンスを作成するとFoo()を呼び出すことができます。
C#コード(Javaモックアップではない)は、「ジェネリック」タイプクラスです:タイプ< T>タイプ<? :BaseClass>。
ありがとうございますが、私のニーズに合っているかどうかはわかりません。問題のある部分は「クラスタイプ」の部分です。有効なC#構文ではないと思います。それがあれば、これは私の問題を解決するはずです。しかし、私はかなり確信しています... –
milin
@ミリン少しの例を書いた私はこれがあなたの疑問をクリアすることを願っています – mybirthname
私は何をしたいのかの例を追加 - あなたの例が懸念している一般的なインスタンスについては問題があり、ジェネリックなタイプのインスタンスには問題があります。 – milin