提问人:SyncMaster 提问时间:3/17/2009 最后编辑:starblueSyncMaster 更新时间:11/17/2023 访问量:81181
如何获取程序集的命名空间?
How to get Namespace of an Assembly?
问:
假设我有一个程序集(类库 dll),我使用以下代码加载了它,
Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");
我需要获取程序集的类型。为了获得类型,我需要程序集的命名空间。
Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);
我怎样才能在上面的一行中获取命名空间。?!为了获取命名空间,我需要获取类型..?
Type.Namespace;
即我需要获取程序集的命名空间,该命名空间可用于获取其类型。
提前致谢
答:
用
Assembly.GetTypes();
这将为你提供所有类型的集合,然后你可以获取每个类型的 Namespace 属性。
然后我想你可以简单地检查所有类型是否具有相同的命名空间值并使用这个值。否则,请添加一些其他逻辑来检测要考虑的命名空间。
一个程序集可以包含多个命名空间。我认为您真正想问的是如何在不指定命名空间的情况下从程序集中获取类型。
我不知道是否有更好的方法,但您可以尝试寻找这样的特定类型(添加 - 使用 linq;
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
如果在不同的命名空间下有 1 个以上具有该名称的类,这将有效地引发(因为 Single 方法确保只有 1 个)。
有关该类的命名空间列表,您可以:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
评论
Assembly.GetName().Name
将为您提供默认命名空间
评论
更新:
如果程序集名称和程序集命名空间在您的项目中是相同的,并且您确定保持主题相同,并且您想要获取当前执行的程序集
的命名空间
,那么您可以使用以下命令:
var namespace = Assembly.GetExecutingAssembly().GetName().Name;
对于加载的组件:
var namespace = myAssembly.GetName().Name;
但是,如果 & 在您的项目中不相同,那么您可以使用这种方式:assembly name
assembly namespace
// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();
评论
若要仅采用命名空间,请遵循以下代码:
var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
var nameSpace = assembly.GetType().Namespace;//Get the namespace
或
public string GetNamespace(object obj)
{
var nameSpace = obj.GetType().Namespace;//Get the namespace
return nameSpace;
}
评论
assembly.GetType()
System.Reflection.RuntimeAssembly
System.Reflection
使用 Mono/Xamarin,你无权访问“NameSpace”属性。您可以改用以下命令:
var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
假设程序集应包含至少一个类型,并且每个类型都位于程序集命名空间中的命名空间中,则其中最短的命名空间将是程序集命名空间。
public string GetAssemblyNamespace(Assembly asm)
{
string ns = "";
foreach (Type tp in asm.Modules.First().GetTypes())
{
if (ns.Length == 0 || tp.Namespace.Length < ns.Length)
ns = tp.Namespace;
}
return ns;
}
Private Function GetRootNamespace() As String
Try
Dim xDeclaringTypeFullName As String = Assembly.GetEntryAssembly.EntryPoint.DeclaringType.FullName
Dim xRootNamespace As String = xDeclaringTypeFullName.Substring(0, xDeclaringTypeFullName.IndexOf("."))
Return xRootNamespace
Catch ex As Exception
Return String.Empty
End Try
End Function
评论