C# 如何通过反射从引用的程序集获取类型
假设我有一个工厂方法,它想要构造一个在运行时通过反射选择的类型的实例。进一步假设我的工厂方法是泛型代码,它不直接引用包含指定类型的程序集,尽管它将从引用了必要程序集的应用程序中运行 我如何编写可以找到这种类型的代码?如果我这样做C# 如何通过反射从引用的程序集获取类型,c#,reflection,C#,Reflection,假设我有一个工厂方法,它想要构造一个在运行时通过反射选择的类型的实例。进一步假设我的工厂方法是泛型代码,它不直接引用包含指定类型的程序集,尽管它将从引用了必要程序集的应用程序中运行 我如何编写可以找到这种类型的代码?如果我这样做 public object CreateInstance(string typeName) { Type desiredType = Assembly.GetExecutingAssembly().GetType(typename); // Insta
public object CreateInstance(string typeName)
{
Type desiredType = Assembly.GetExecutingAssembly().GetType(typename);
// Instantiate the type...
}
这似乎失败,因为类型未在执行程序集中定义。如果我能在运行时获得所有可用的程序集,我就可以对它们进行迭代,并找到哪一个包含我想要的类型。但我看不出有什么办法AppDomain.CurrentDomain.GetAssemblys()
看起来很有希望,但没有返回我在项目中引用的所有程序集
编辑:有几个人指出我需要加载程序集。问题是,这段代码不知道应该加载哪个程序集,因为我试图以不依赖于其他程序集的方式编写这段代码
我故意省略了
typeName
的细节,因为在我的实际代码中,从字符串到类型的映射实际上更复杂。事实上,该类型由包含指定字符串的自定义属性标识,但如果我可以获得类型列表,则将列表限制为所需类型不会有问题。AppDomain.CurrentDomain.GetAssemblys()
仅返回加载的程序集。因此,如果引用的程序集尚未加载,则需要加载该程序集。对AppDomain.CurrentDomain.GetAssemblys()
的调用仅返回当前加载到AppDomain
中的DLL集。DLL按需加载到CLR进程中;因此,在实际使用DLL之前,它不会包含项目中引用的所有DLL
但是,您可以通过使用typeof
表达式强制程序集进入流程。比如说
var force1 = typeof(SomeTypeInTheProject).Assembly;
var force2 = typeof(SomeTypeInProject2).Assembly;
您可以使用GetReferencedAssembly并循环遍历所有类型,直到找到要查找的类型
var t = Assembly
.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(x => Assembly.Load(x))
.SelectMany(x => x.GetTypes()).First(x => x.FullName == typeName);
虽然它可能不是最有效的。同样,您使用的是反射。typeName中的值是多少?这是一个完全限定的名称吗?谢谢,这似乎是可行的——因为所有可能的类型都在同一个程序集中,所以我只需要对一个类型执行此操作。不过感觉很难看。好主意。这对我来说不太管用,因为程序集不是直接引用的,而是由调用程序集间接引用的;大概我可以通过递归调用找到的每个程序集上的.getReferenceAssembly()来找到它(并从.GetEntryAssembly()而不是.getExecutionGassembly()开始)。是的,它的性能不是很好,但这对我来说没关系,因为它是启动代码,只运行一次。