質問
すべて同じ方法で作成される多数のMDI子ノードがあり、冗長なコードを減らすために、メソッドを呼び出して、文字列(子ノードの名前)を渡し、作成するノードを追加し、親に追加します。
クラス名の文字列からクラスを作成する以外のすべてのことを行うことができます。どうすればできますか?
解決
現在、アプリケーションの1つでこれを使用してクラスを更新しています
public static IMobileAdapter CreateAdapter(Type AdapterType)
{
return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}
IMobileAdapterを実装するクラスのインスタンスを返しますが、文字列でも同様に簡単に使用できます:
public static IMyClassInterface CreateClass(string MyClassType)
{
return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}
次のようなコードを使用して呼び出します:
IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");
もちろん、この場合、作成するクラスはインターフェースIMyClassInterfaceを実装する必要がありますが、クラスファクトリを使用すると、すべてのクラスで同じインターフェースを実装することになります。
編集:
コメントを参照して、この議論の目的のために、<!> quot; assembly <!> quot;という用語を考えてください。 vb / csプロジェクト内のファイルのセットとして。これをすべて単一のプロジェクト[アセンブリ]内で実行し、複数のプロジェクトにまたがっていないことを前提としています。
クラスがFormオブジェクトを拡張する場合、このようなことをします。
Form myInst = CreateClass("MyExtendedForm");
または
Form myInst = CreateClass(Type.GetType("MyExtendedForm"));
CreateClassメソッド内で取得するか、外部で取得するかによって異なります。カスタムメンバーにアクセスするには、インスタンスを正しい型にキャストする必要があります。これを考慮してください:
class MyCustomForm : Form
{
public int myCustomField{ get; set; }
}
myCustomFieldプロパティを追加するFormを拡張するカスタムフォームがあります。 Activator.CreateInstance()を使用してこれをインスタンス化します:
public static Form CreateClass(string InstanceName)
{
return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}
次に、次を使用して呼び出します:
Form myInst = CreateClass("MyCustomForm");
これで、myInstにカスタムフォームが保存されました。ただし、カスタムプロパティ[myCustomField]にアクセスするには、インスタンスを正しいフォームにキャストする必要があります。
int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;
他のヒント
Activator.CreateInstance(Type.GetType(typeName))
クラスの名前である文字列がある場合、Type.GetType(string)を呼び出すことにより、そこからTypeオブジェクトを取得できるはずです。そのタイプから、リフレクションを使用してオブジェクトを生成できるはずです。