C #에서 리플렉션을 통해 네임 스페이스의 모든 클래스를 어떻게 얻습니까?
C #에서 리플렉션을 통해 네임 스페이스의 모든 클래스를 어떻게 얻습니까?
답변:
다음 코드 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)
&& t.Namespace == @namespace
" 를 제거하려고했습니다.
&& t.Namespace == @namespace
하면 .net을 포함한 모든 어셈블리 의 모든 클래스 가 제공 됩니다. GetAssemblies
모든 어셈블리 GetAssemblies().SelectMany(t => t.GetTypes())
를 제공 하고 모든 어셈블리의 모든 유형 (클래스, 구조체 등)을 제공합니다.
Assembly.Load(nameof(NameOfMyNamespace))
잘 작동 하여 어셈블리를 강제로로드한다는 것을 알았습니다 .
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);
}
classlist
에 대한 첫 번째 반복에 직접 추가하지 않는 속도를 늦추는 것 asm.GetTypes()
입니다.
특정 어셈블리, 네임 스페이스 및 클래스 이름의 경우 :
var assemblyName = "Some.Assembly.Name"
var nameSpace = "Some.Namespace.Name";
var className = "ClassNameFilter";
var asm = Assembly.Load(assemblyName);
var classes = asm.GetTypes().Where(p =>
p.Namespace == nameSpace &&
p.Name.Contains(className)
).ToList();
참고 : 프로젝트는 어셈블리를 참조해야합니다.
다음은 유형 중 하나가 다른 어셈블리에서 유형을 소급하는 경우 찾을 수있는 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);
}
다른 어셈블리에 정의 된로드 유형에 도움이됩니다.
희망이 도움이됩니다!
Assembly a
물건 이이 이벤트를 발생시킬 수있는 정상적인 처리를 나타냅니다. 오류 해결 a
에 도움이 되지 않습니다 LoaderException
. 내가 맞아?
네임 스페이스가 여러 어셈블리를 브리지 할 수 있기 때문에 네임 스페이스에서 모든 유형을 가져올 수는 없지만 어셈블리의 모든 클래스를 가져 와서 해당 네임 스페이스에 속하는지 확인할 수 있습니다.
Assembly.GetTypes()
로컬 어셈블리에서 작동하거나 먼저 어셈블리를로드 한 다음 호출 할 수 있습니다 GetTypes()
.
AppDomain.CurrentDomain.GetAssemblies
도움이 될 수 있습니다.
@aku 답변과 마찬가지로 확장 방법을 사용하십시오.
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
네임 스페이스는 실제로 런타임 디자인에서 수동적이며 주로 조직 도구로 사용됩니다. .NET에서 유형의 전체 이름은 네임 스페이스와 클래스 / Enum / Etc로 구성됩니다. 결합. 특정 어셈블리 만 통과하려면 어셈블리에서 반환 한 형식을 반복하면됩니다. 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
AttributeClass
이름 은 무엇입니까 MustHaveAttributes
? 클래스에 속성이 있는지 여부를 테스트하는 것과 관련이 없습니다. 이것은 도움이되는 것보다 더 혼란 스럽다.