我知道C#是一种静态类型的语言,我已经阅读了这篇SO帖子的答案: initialize a class by string variable in c#?
然而,我的问题有点不同。我正在使用T4模板,它为类提供了一个类的名称作为字符串参数。我会在这里给出模板代码,但重要的是类型是在字符串中,所以它与在任何C#模块中使用此语句相同:
string s = "MyNamespace.Customer.Model";
使用该字符串,我需要将类型转换为Type变量。通常,当我有权访问实际类型时,我会使用此代码:
Type typeModel = typeof(MyNamespace.Customer.Model);
如何获得给定字符串的Type?换句话说,我的代码理想情况下看起来像这样(我知道这不起作用,因为“s”是一个字符串):
Type typeModel = typeof(s);
(顺便说一下,我确实知道类型是什么程序集,所以我可以使用那些信息;同样,模板引用包含有问题类型的程序集,这是值得的...)
注意:我不想创建Type的对象实例,所以请不要建议需要使用Activator.CreateInstance的解决方案,除非这是唯一的解决方案......
感谢您提出的任何想法。
答案 0 :(得分:1)
方法Type.GetType(string typeName)
执行您想要的操作,但如果您只提供该类型的FullName
(命名空间和名称),它将只解析当前程序集或mscorlib中的类型。
如果要解析当前程序集之外的类型,则需要提供AssemblyQualifiedName
。问题当然是多个程序集可以包含具有相同名称和命名空间的不同类型(感谢Steven Liekens):
string aqn = Assembly.CreateQualifiedName(assemblyName, namespaceAndNameOfType);
Type t = Type.GetType(aqn);
如果您事先不知道程序集,可以通过以下方式处理:
AppDomain.BaseDirectory
或AppDomain.GetAssemblies()
用于当前加载的程序集然后迭代每个程序集的GetTypes()
方法。