如何在当前程序集中找到具有特定名称的 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”)。在运行时,我想通过类名选择合适的实现。

// 像这样使用: IStep step = GetStep(sName);

【问题讨论】:

【参考方案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# 接口的实现?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用反射获取类型的完全限定名称

如何在PeopleSoft中找到并更改默认样式表名称

如何获取具有特定名称/值的所有变体ID

C#中,findWindow函数怎么不能找到??

如何在 C# 中获取当前可执行文件的名称?

如何将具有特定功能的对象定义为类型或接口?