通过reflection获取名称空间中的所有types
如何通过C#中的reflection来获取名称空间中的所有类?
以下代码打印当前程序集中定义的指定namespace
的类的namespace
。
正如其他人指出的,名称空间可以分散在不同的模块之间,所以您需要先获得程序集列表。
string nspace = "..."; var q = from t in Assembly.GetExecutingAssembly().GetTypes() where t.IsClass && t.Namespace == nspace select t; q.ToList().ForEach(t => Console.WriteLine(t.Name));
正如FlySwat所说,你可以在多个程序集中拥有相同的命名空间(例如System.Collections.Generic
)。 如果它们尚未加载,则必须加载所有这些程序集。 所以为了一个完整的答案:
AppDomain.CurrentDomain.GetAssemblies() .SelectMany(t => t.GetTypes()) .Where(t => t.IsClass && t.Namespace == @namespace)
这应该工作,除非你想要其他域的类。 要获取所有域的列表,请点击此链接。
using System.Reflection; using System.Collections.Generic; //... static List<string> GetClasses(string nameSpace) { Assembly asm = Assembly.GetExecutingAssembly(); List<string> namespacelist = new List<string>(); List<string> classlist = new List<string>(); foreach (Type type in asm.GetTypes()) { if (type.Namespace == nameSpace) namespacelist.Add(type.Name); } foreach (string classname in namespacelist) classlist.Add(classname); return classlist; }
如果其中一个types子types在另一个程序集中,则可能会发现LoaderException错误的修复程序:
// Setup event handler to resolve assemblies AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename); a.GetTypes(); // process types here // method later in the class: static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) { return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name); }
这应该有助于加载其他程序集中定义的types。
希望有所帮助!
您将无法获取名称空间中的所有types,因为名称空间可以桥接多个程序集,但可以获取程序集中的所有类并检查它们是否属于该名称空间。
Assembly.GetTypes()
在本地程序集上工作,也可以先加载程序集,然后调用GetTypes()
。
对于一个特定的程序集,使用类名称filter:
var asm = Assembly.Load("Some.Assembly.Name"); var nameSpace = "Some.Namespace.Name"; var classes = asm.GetTypes().Where(p => p.Namespace == nameSpace && p.Name.Contains("ClassNameFilter") ).ToList();
注意:项目必须引用程序集
就像@aku回答,但使用扩展方法:
string @namespace = "..."; var types = Assembly.GetExecutingAssembly().GetTypes() .Where(t => t.IsClass && t.Namespace == @namespace) .ToList(); types.ForEach(t => Console.WriteLine(t.Name));
命名空间实际上在运行时的devise中是被动的,主要作为组织工具。 .NET中的一个types的完整名称由Namespace和Class / Enum / Etc组成。 结合。 如果你只希望通过一个特定的程序集,你只需简单地循环一下程序集返回的types即可。 GetExportedTypes()检查types的值。 命名空间 如果您正在尝试通过当前AppDomain中加载的所有程序集,它将涉及使用AppDomain.CurrentDomain。 GetAssemblies()
//a simple combined code snippet using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace MustHaveAttributes { class Program { static void Main ( string[] args ) { Console.WriteLine ( " START " ); // what is in the assembly Assembly a = Assembly.Load ( "MustHaveAttributes" ); Type[] types = a.GetTypes (); foreach (Type t in types) { Console.WriteLine ( "Type is {0}", t ); } Console.WriteLine ( "{0} types found", types.Length ); #region Linq //#region Action //string @namespace = "MustHaveAttributes"; //var q = from t in Assembly.GetExecutingAssembly ().GetTypes () // where t.IsClass && t.Namespace == @namespace // select t; //q.ToList ().ForEach ( t => Console.WriteLine ( t.Name ) ); //#endregion Action #endregion Console.ReadLine (); Console.WriteLine ( " HIT A KEY TO EXIT " ); Console.WriteLine ( " END " ); } } //eof Program class ClassOne { } //eof class class ClassTwo { } //eof class [System.AttributeUsage ( System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = true )] public class AttributeClass : System.Attribute { public string MustHaveDescription { get; set; } public string MusHaveVersion { get; set; } public AttributeClass ( string mustHaveDescription, string mustHaveVersion ) { MustHaveDescription = mustHaveDescription; MusHaveVersion = mustHaveVersion; } } //eof class } //eof namespace
部分名称空间名称获取所有类:
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
非常简单
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes(); foreach (var item in types) { }