Joh*_*aze 6 .net c# reflection assemblies
我需要从它的全名创建一个类型Ex:"System.String"或"Tuple'2 [string,Mytype]".字符串中没有关于程序集的信息.这是代码的样子.
private static Type LoadType(string typeName)
{
// try loading the type
Type type = Type.GetType(typeName, false);
if (type != null)
return type;
// if the loading was not successfull iterate all the referenced assemblies and try to load the type.
Assembly asm = Assembly.GetEntryAssembly();
AssemblyName[] referencedAssemblies = asm.GetReferencedAssemblies();
foreach (AssemblyName referencedAssemblyName in referencedAssemblies)
{
type = referencedAssembly.GetType(typeName, false);
if (type != null)
return type;
}
throw new TypeLoadException(string.Format("Could not load the Type '{0}'",typeName));
}
Run Code Online (Sandbox Code Playgroud)
当类型不是通用的时,此方法有效.但是对于泛型类型,遍历程序集总是失败,因为没有程序集包含构建类型所需的所有定义.
有没有办法在调用GetTypes时为类型解析提供多个程序集?
你将不得不以我认为的艰难方式去做.幸运的是,这并不难.很简单:
像这样......
Type.GetType("namespace.typename`1[[namespace.typename, assemblyname]], assemblyname");
Run Code Online (Sandbox Code Playgroud)
例如
var type = Type.GetType("System.Collections.Generic.List`1[[System.String, mscorlib]], mscorlib");
var instance = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)
或者,正如埃里克所说..如果你手头有类型,那就建立它吧.
Type genericType = typeof(Dictionary<,>);
Type constructedType = genericType.MakeGenericType(new Type[] { typeof(String), typeof(String) });
Run Code Online (Sandbox Code Playgroud)