Следующий код печатает названия классов в указанном 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));
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;
}
нбар: вышеупомянутый код иллюстрирует то, что продолжается. Необходимо было реализовать его, упрощенная версия может использоваться:
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
//...
static IEnumerable<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
return asm.GetTypes()
.Where(type => type.Namespace == nameSpace)
.Select(type => type.Name);
}
Вот фиксация для ошибок 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);
}
, Который должен помочь с загрузкой типов, определенных в других блоках.
Hope, которая помогает!
Вы не будете в состоянии получить все типы в пространстве имен, потому что пространство имен может соединить несколько блоков мостом, но можно заставить все классы в блоке и проверке видеть, принадлежат ли они тому пространству имен.
Assembly.GetTypes()
работы над локальным блоком, или можно загрузиться, блок сначала тогда звонят GetTypes()
на нем.
Пространства имен на самом деле довольно пассивны в дизайне времени выполнения и служат, прежде всего, в качестве организационных инструментов. Полное имя типа в.NET состоит из Пространства имен и Класса/Перечисления/И т.д. объединенный. Если бы Вы только хотите пройти определенный блок, Вы просто циклично выполнились бы через типы, возвращенные блоком. GetExportedTypes () проверка значения типа. Пространство имен . Если бы Вы пытались пройти все блоки, загруженные в текущем 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