5

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

クラス名の文字列からクラスを作成する以外はすべてできますが、どうすればよいですか?

4

3 に答える 3

6

私は現在、アプリケーションの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;
于 2009-01-23T15:25:18.720 に答える
3
Activator.CreateInstance(Type.GetType(typeName))
于 2009-01-23T15:25:38.860 に答える
0

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

于 2009-01-23T15:23:11.377 に答える