有没有办法让包含名称的类的程序集TestClass?我只知道类名,所以我无法创建它的实例.和
Type objectType = assembly.GetType("TestClass");
Run Code Online (Sandbox Code Playgroud)
不适合我.
Dir*_*mar 27
Assembly asm = typeof(TestClass).Assembly;
Run Code Online (Sandbox Code Playgroud)
只要它被引用,它将为您提供装配.否则,您必须使用完全限定名称:
Assembly asm = null;
Type type = Type.GetType("TestNamespace.TestClass, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
if (type != null)
{
asm = type.Assembly;
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 19
从Type objectType问题的角度来看,我假设你实际上是按照名字的类型(不是汇编); 所以假设加载程序集并且类型名称是唯一的,LINQ可能会有所帮助:
Type objectType = (from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetTypes()
where type.IsClass && type.Name == "TestClass"
select type).Single();
object obj = Activator.CreateInstance(objectType);
Run Code Online (Sandbox Code Playgroud)
但是,使用程序集限定名称而不是类型名称可能更好.
实际上,在大多数情况下,了解类名就足够了。MSDN 说 - 如果类型位于当前执行的程序集或 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。
Type neededType = Type.GetType("TestClass"); //or typeof(TestClass)
Assembly a = neededType.Assembly;
Run Code Online (Sandbox Code Playgroud)
如果您不知道包含类型的程序集(虽然我无法想象为什么)-
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Asssembly result = assemblies.FirstOrDefault(a=>a.GetType("TestClass",false)!=null);
Run Code Online (Sandbox Code Playgroud)
唯一的限制 - 包含 TestClass 的程序集应该在调用此类代码时已经加载。
希望这会有所帮助。:)
Marc 的回答非常好,但由于它太慢(我经常使用这种方法),我决定采用不同的方法:
private static Dictionary<string, Type> types;
private static readonly object GeneralLock = new object();
public static Type FindType(string typeName)
{
if (types == null)
{
lock (GeneralLock)
{
if (types == null)
{
types = new Dictionary<string, Type>();
var appAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var appAssembly in appAssemblies)
{
foreach (var type in appAssembly.GetTypes())
if (!types.ContainsKey(type.Name))
types.Add(type.Name, type);
}
}
}
}
return types[typeName];
}
Run Code Online (Sandbox Code Playgroud)
你可以按照你想要的方式处理名称冲突,但在这个例子中我决定忽略后续的。
| 归档时间: |
|
| 查看次数: |
28837 次 |
| 最近记录: |