在.Net中,给定一个类型名称,是否有一个方法告诉我在哪个程序集(System.Reflection.Assembly的实例)中定义了该类型?
我认为我的项目已经有了对该程序集的引用,只需要知道它是哪一个。
答案 0 :(得分:37)
Assembly.GetAssembly假设您有一个类型的实例,Type.GetType假定您拥有包含程序集名称的完全限定类型名称。
如果您只有基本类型名称,则需要执行以下操作:
public static String GetAssemblyNameContainingType(String typeName)
{
foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type t = currentassembly.GetType(typeName, false, true);
if (t != null) {return currentassembly.FullName;}
}
return "not found";
}
这也假设您的类型在根中声明。您需要在名称中提供命名空间或封闭类型,或以相同的方式迭代。
答案 1 :(得分:31)
Assembly.GetAssembly(typeof(System.Int32))
将System.Int32
替换为您需要的任何类型。因为它接受Type
参数,所以你可以这样做,例如:
string GetAssemblyLocationOfObject(object o) {
return Assembly.GetAssembly(o.GetType()).Location;
}
答案 2 :(得分:2)
Type.GetType(typeNameString).Assembly
答案 3 :(得分:2)
我已根据自己的目的调整了接受的答案(返回汇编对象而不是程序集名称),并重构了VB.NET和LINQ的代码:
Public Function GetAssemblyForType(typeName As String) As Assembly
Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function
我只是在这里分享它,如果其他人想要一个LINQy解决方案来接受答案。
答案 4 :(得分:-1)
如果你可以使用它,这个语法是最短/最干净的:
typeof(int).Assembly