有没有办法获得包含名称为TestClass
的类的程序集? 我只知道类名,所以我不能创建它的一个实例。和按类名获得程序集
Type objectType = assembly.GetType("TestClass");
没有为我工作。
有没有办法获得包含名称为TestClass
的类的程序集? 我只知道类名,所以我不能创建它的一个实例。和按类名获得程序集
Type objectType = assembly.GetType("TestClass");
没有为我工作。
从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);
但是,它可能是更好地与装配合格的名称,而不是类型名称的工作。
无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。 – Soonts 2010-11-09 14:29:28
@Soonts - 听起来像是可能在缺失的程序集中存在依赖关系? – 2010-11-09 14:48:54
Assembly asm = typeof(TestClass).Assembly;
只要它被引用就会让你装配。否则,你将不得不使用一个完全合格的名称:在这个问题
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;
}
在大多数情况下,实际上classname的知识已经足够了。 MSDN说 - 如果类型位于当前正在执行的程序集或Mscorlib.dll中,那么提供由其名称空间限定的类型名称就足够了。
Type neededType = Type.GetType("TestClass"); //or typeof(TestClass)
Assembly a = neededType.Assembly;
如果你不知道含有组装式(虽然我不能想象为什么) -
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Asssembly result = assemblies.FirstOrDefault(a=>a.GetType("TestClass",false)!=null);
唯一的限制 - 装配含TestClass的应该是已经装载在呼唤这样的代码的时刻。
希望这会有所帮助。 :)
马克的回答是非常好的,但由于它太慢了(我经常使用这种方法),我决定用不同的方法去:
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];
}
您可以处理名称冲突你想要的方式,但在这个例子中,我决定忽略后面的那些。
遍历所有引用的程序集将是您唯一的选择,但它也很容易导致重复。但我不完全相信这是你的所有信息,所以你应该试着更明确地说明你的问题的推理。 – 2010-09-07 09:31:05