IStep
いくつかの計算を実行できるInterface という名前があります (「名詞の王国での実行」を参照)。実行時に、クラス名で適切な実装を選択したいと考えています。
// 次のように使用します。 IStep ステップ = GetStep(sName);
IStep
いくつかの計算を実行できるInterface という名前があります (「名詞の王国での実行」を参照)。実行時に、クラス名で適切な実装を選択したいと考えています。
// 次のように使用します。 IStep ステップ = GetStep(sName);
あなたの質問は非常に紛らわしいです...
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"));
実装にパラメーターなしのコンストラクターがある場合は、System.Activator クラスを使用してこれを行うことができます。クラス名に加えて、アセンブリ名を指定する必要があります。
IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
他の人が指摘したことに基づいて、これは私が最終的に書いたものです:
/// /// ここでいくつかの魔法が起こります: 型を反映して、取るべき正しいアクションを見つけます /// その名前で 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); } }
まあ、Assembly.CreateInstance が適しているように思えますが、これに関する唯一の問題は、型の完全修飾名、つまり名前空間を含む必要があることです。