6

IStepいくつかの計算を実行できるInterface という名前があります (「名詞の王国での実行」を参照)。実行時に、クラス名で適切な実装を選択したいと考えています。

// 次のように使用します。
IStep ステップ = GetStep(sName);
4

4 に答える 4

8

あなたの質問は非常に紛らわしいです...

IStep を実装する型を見つけたい場合は、次のようにします。

foreach (Type t in Assembly.GetCallingAssembly().GetTypes())
{
  if (!typeof(IStep).IsAssignableFrom(t)) continue;
  Console.WriteLine(t.FullName + " implements " + typeof(IStep).FullName);
}

必要なタイプの名前がす​​でにわかっている場合は、これを実行してください

IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType"));
于 2008-08-21T11:53:00.647 に答える
2

実装にパラメーターなしのコンストラクターがある場合は、System.Activator クラスを使用してこれを行うことができます。クラス名に加えて、アセンブリ名を指定する必要があります。

IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

于 2008-08-21T11:50:56.050 に答える
1

他の人が指摘したことに基づいて、これは私が最終的に書いたものです:

///
/// ここでいくつかの魔法が起こります: 型を反映して、取るべき正しいアクションを見つけます
/// その名前で IStep からサブクラス化されます。
///
プライベート IStep GetStep (文字列 sName)
{
    アセンブリ アセンブリ = Assembly.GetAssembly(typeof (IStep));

    試す
    {
        return (ISep) (assembly.GetTypes() の t から)
                        どこで t.Name == sName && t.GetInterface("IStep") != null
                        を選択
                        .First().GetConstructor(新しいタイプ[] {}
                        .Invoke(新しいオブジェクト[] {});
    }
    キャッチ (InvalidOperationException e)
    {
        throw new ArgumentException("Action not supported: " + sName, e);
    }
}
于 2008-08-21T11:54:53.933 に答える
0

まあ、Assembly.CreateInstance が適しているように思えますが、これに関する唯一の問題は、型の完全修飾名、つまり名前空間を含む必要があることです。

于 2008-08-21T11:56:42.743 に答える