すべて同じ方法で作成された多数の 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 を実装する必要がありますが、クラス ファクトリを使用すると、とにかくすべてのクラスが同じインターフェイスを実装する可能性があります。
編集:
あなたのコメントを参照して、この議論の目的のために、「アセンブリ」という用語を 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 オブジェクトを取得できるはずです。その型から、リフレクションを使用してオブジェクトを生成できるはずです。