Получение всех типов в пространстве имен через отражение

251
задан H.B. 3 February 2012 в 18:02
поделиться

6 ответов

Следующий код печатает названия классов в указанном 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));
304
ответ дан caesay 23 November 2019 в 02:54
поделиться
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);
}
24
ответ дан JohnLBevan 23 November 2019 в 02:54
поделиться

Вот фиксация для ошибок 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, которая помогает!

12
ответ дан tsimon 23 November 2019 в 02:54
поделиться

Вы не будете в состоянии получить все типы в пространстве имен, потому что пространство имен может соединить несколько блоков мостом, но можно заставить все классы в блоке и проверке видеть, принадлежат ли они тому пространству имен.

Assembly.GetTypes() работы над локальным блоком, или можно загрузиться, блок сначала тогда звонят GetTypes() на нем.

9
ответ дан nawfal 23 November 2019 в 02:54
поделиться

Пространства имен на самом деле довольно пассивны в дизайне времени выполнения и служат, прежде всего, в качестве организационных инструментов. Полное имя типа в.NET состоит из Пространства имен и Класса/Перечисления/И т.д. объединенный. Если бы Вы только хотите пройти определенный блок, Вы просто циклично выполнились бы через типы, возвращенные блоком. GetExportedTypes () проверка значения типа. Пространство имен . Если бы Вы пытались пройти все блоки, загруженные в текущем AppDomain, то он включил бы использование AppDomain. CurrentDomain. GetAssemblies ()

3
ответ дан TheXenocide 23 November 2019 в 02:54
поделиться
//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 
2
ответ дан 23 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: