Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过反射从引用的程序集获取类型_C#_Reflection - Fatal编程技术网

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()开始)。是的,它的性能不是很好,但这对我来说没关系,因为它是启动代码,只运行一次。