如何在当前程序集中找到具有特定名称的 C# 接口的实现?
Posted
技术标签:
【中文标题】如何在当前程序集中找到具有特定名称的 C# 接口的实现?【英文标题】:How to find an implementation of a C# interface in the current assembly with a specific name? 【发布时间】:2010-09-06 09:17:33 【问题描述】:我有一个名为IStep
的接口,它可以进行一些计算(参见“Execution in the Kingdom of Nouns”)。在运行时,我想通过类名选择合适的实现。
【问题讨论】:
【参考方案1】:你的问题很混乱……
如果您想查找实现 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"));
【讨论】:
【参考方案2】:如果实现有一个无参数的构造函数,你可以使用 System.Activator 类来做到这一点。除了类名之外,您还需要指定程序集名称:
IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep;
http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx
【讨论】:
【参考方案3】:根据其他人的指出,这就是我最终写的:
/// /// 这里发生了一些神奇的事情:通过反射类型找到要采取的正确操作 /// 从具有该名称的 IStep 子类化。 /// 私人 IStep GetStep(字符串 sName) 程序集程序集 = Assembly.GetAssembly(typeof (IStep)); 尝试 return (IStep) (来自 t in assembly.GetTypes() 其中 t.Name == sName && t.GetInterface("IStep") != null 选择 ).First().GetConstructor(新类型[] ).Invoke(新对象[] ); 捕获(InvalidOperationException e) throw new ArgumentException("不支持动作:" + sName, e);【讨论】:
【参考方案4】:Assembly.CreateInstance 似乎是可行的方法 - 唯一的问题是它需要类型的完全限定名称,即包括命名空间。
【讨论】:
以上是关于如何在当前程序集中找到具有特定名称的 C# 接口的实现?的主要内容,如果未能解决你的问题,请参考以下文章