0

2つのプロジェクトを含むソリューションがあります。まず、私のシナリオについて説明します。プロジェクト1:私が興味を持っている次の2つのプロパティとメソッドを持つMyBaseClassを呼び出す基本クラスを保持します。

TypeToLoad-単純なget/set機能でインスタンス化するクラスを継承した静的文字列プロパティ。

インスタンス-次のコード行でTypeToLoadで指定されたタイプのMyBaseClassインスタンスを返す静的プロパティ。

public static MyBaseClass Instance{
   return (MyBaseClass)Activator.CreateInstance(Type.typeof(TypeToLoad));
}

2番目のプロジェクトでは、次のようにMyBaseClassを継承します(もちろん、適切な名前空間と参照が追加されています)。

public class MyInheritClass : MyBaseClass {
    //implements all other functions of MyBaseClass;
}

MyInheritClassと同じプロジェクトにある他のコードファイルの1つに、次のコード行があります。

Type myType = Type.typeof("MyInheritClass"); //returns the correct "Type"
MyBaseClass.TypeToLoad = "MyInheritClass";
MyBaseClass myInstance = MyBaseClass.Instance; //Errors... because Type.typeof(...) could not resolve "MyInheritClass".

MyInheritClassコードファイルをMyBaseClassと同じプロジェクトに移動すると、コードは正常に実行されます。

私の質問は、同じプロジェクトにこれら2つのクラス(ベースDLLクラスライブラリのMyBaseClassと別のプロジェクトのMyInheritClass)を持たなくても、MyBaseClass.TypeToLoad = "MyInheritClass"を設定して、MyBaseClass.Instanceを使用してMyInheritClassのインスタンスを作成する方法はありますか? MyBaseclass DLLライブラリを参照しています)?

リフレクション、アクティベーターを検索しようとしましたが、探しているものが見つかりませんでした。たぶん私はこれの正しい用語を知りません。

4

1 に答える 1

2

あなたが実際に意味していると仮定するとType.GetType()(そしてType.typeof()コンパイルされない)、それはあなたが観察していることを正確に実行していると明確に文書化されています:

取得するタイプのアセンブリ修飾名。[…]型が現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾された型名を指定するだけで十分です。

また、それを修正する方法についても説明します。アセンブリの名前をタイプ名に追加します。したがって、タイプがで呼び出されたMyInheritClass場合、それはMyNamespace名前空間とMyAssemblyアセンブリ(通常はプロジェクト名と同じ)にあり、タイプ名を次のように設定できます。

MyNamespace.MyInheritClass, MyAssembly

そしてそれは動作するはずです。

また、タイプ名に文字列を使用することは避けてください。実際のTypeオブジェクトを使用する方がはるかに安全です。タイプではなくTypeToLoad、タイプである必要があります。Typestring

あるいは、このようなデザインを使用するべきではないかもしれません。なぜこれを行うのかはわかりませんが、このような基本クラスに静的フィールドを設定することを含まない、より良い解決策があると確信しています。(同じ基本クラスを実装する2つのタイプがある場合はどうなりますか?)

于 2012-03-27T01:15:10.560 に答える