5


1

私は、すべて同じ方法で作成され、冗長なコードを減らすために、メソッドを呼び出し、それに文字列(子ノードの名前)を渡し、ノードを作成させ、それを親に追加します。

クラス名の文字列からクラスを作成する以外のことはすべて実行できますが、どうすればよいでしょうか。

3 Answer


6


私は現在クラスの新規作成のために私のアプリケーションの1つでこれを使っています

パブリックstatic IMobileAdapter CreateAdapter(Type AdapterType){return(IMobileAdapter)System.Activator.CreateInstance(AdapterType); }

IMobileAdapterを実装するクラスのインスタンスが返されますが、文字列を使用して同様に簡単に使用できます。

public static IMyClassInterface CreateClass(s​​tring MyClassType){return(IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType)); }

次のようなコードを使用してそれを呼び出します。

IMyClassInterface myInst = CreateClass( "MyNamespace.MyClass、MyAssembly");

もちろん、この場合、作成するクラスはIMyClassInterfaceインターフェイスを実装する必要がありますが、クラスファクトリを使用すると、とにかくすべてのクラスに同じインターフェイスを実装することになります。

  • 編集: *

あなたのコメントを参考にして、この議論の目的のために、あなたのvb / csプロジェクト内のファイルのセットとして用語「アセンブリ」を考えてください。 私はあなたが一つのプロジェクトの中でこれをすべてやっていると思います

複数のプロジェクトにまたがることはありません。

あなたのクラスがFormオブジェクトを拡張することになるので、あなたはこのようなことをするでしょう。

フォームmyInst = CreateClass( "MyExtendedForm");

または

フォームmyInst = CreateClass(Type.GetType( "MyExtendedForm"));

あなたがあなたのCreateClassメソッドの中でタイプを取得するか、それの外側で取得するかによって異なります。 カスタムメンバーにアクセスするには、インスタンスを正しい型にキャストする必要があります。 このことを考慮:

クラスMyCustomForm:Form {public int myCustomField {get;};セット; }}

myCustomFieldプロパティを追加してFormを拡張するカスタムフォームがあります。 Activator.CreateInstance()を使用してこれをインスタンス化したいです。

public static Form CreateClass(文字列InstanceName){return(Form)System.Activator.CreateInstance(Type.GetType(InstanceName)); }

私はそれを使用してそれを呼び出す:

フォームmyInst = CreateClass( "MyCustomForm");

だから今私は私のカスタムフォームをmyInstに格納しています。 ただし、カスタムプロパティ[myCustomField]にアクセスするには、インスタンスを正しいフォームにキャストする必要があります。

int someVal =((Type.GetType( "MyCustomForm"))myInst).myCustomField;


3


Activator.CreateInstance(Type.GetType(typeName))


0


クラスの名前である文字列がある場合は、Type.GetType(string)を呼び出すことによって、そこからTypeオブジェクトを取得できるはずです。 そのタイプから、オブジェクトを生成するためにリフレクションを使うことができるはずです。