c# - 如何通过反射从引用的程序集中获取类型

标签 c# reflection

假设我有一个工厂方法,它想要通过反射构造一个在运行时选择的类型的实例。进一步假设我的工厂方法是不直接引用包含指定类型的程序集的通用代码,尽管它将从引用了必要程序集的应用程序中运行。

我如何着手编写可以找到这种类型的代码?如果我执行以下操作

public object CreateInstance(string typeName)
{
    Type desiredType = Assembly.GetExecutingAssembly().GetType(typename);

    // Instantiate the type...
}

这似乎失败了,因为类型没有在执行程序集中定义。如果我可以在运行时获得所有可用的程序集,我可以遍历它们并找到哪个包含我想要的类型。但我看不到这样做的方法。 AppDomain.CurrentDomain.GetAssemblies() 看起来很有希望,但没有返回我在项目中引用的所有程序集。

编辑:几个人指出我需要加载程序集。问题是,这段代码不知道它应该加载哪个程序集,因为我试图以不依赖于其他程序集的方式编写这段代码。

我故意省略了 typeName 的细节,因为在我的实际代码中从字符串到类型的映射实际上更复杂。事实上,类型由包含指定字符串的自定义属性标识,但如果我可以获得类型列表,则将列表限制为所需类型不会有问题。

最佳答案

您可以使用 GetReferencedAssemblies 并遍历所有类型,直到找到您要查找的类型。

var t = Assembly
   .GetExecutingAssembly()
   .GetReferencedAssemblies()
   .Select(x => Assembly.Load(x))
   .SelectMany(x => x.GetTypes()).First(x => x.FullName == typeName);

虽然它可能不是最高效的。再一次,您正在使用反射。

关于c# - 如何通过反射从引用的程序集中获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291117/

相关文章:

c# - 在 Chrome 中捕获 XHR/Ajax 请求

java - 访问构造的注释参数进行修改

mongodb - 使用 'reflect' 将数据 append 到指向已定义结构的接口(interface)

android - 如何在 BaseFragment() 中使用 Reflection 实现数据绑定(bind)

c# - 由 Directory.Delete() 引起的 WCF 安全异常

c# - 如何对 Nullable Int 使用条件运算

java - 从 java 变量调用类方法

c# - 通过反射从对象获取索引值

c# - 为什么实例化 Azure 移动服务时出错?

javascript - AJAX-Post 之后文件未下载