Getting all types in a namespace via reflection
How do you get all the classes in a namespace through reflection in 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)
This should work unless you want classes of other domains. To get a list of all domains, follow this link.
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;
}
NB: 위의 코드는 무슨 일이 일어나고 있는지 설명합니다.이를 구현할 경우 단순화된 버전을 사용할 수 있습니다.
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);
}
특정 표준횡단, NameSpace 및 ClassName:
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.GetTypes()
로컬 어셈블리에서 작동하거나, 먼저 어셈블리를 로드한 다음 호출할 수 있습니다.GetTypes()
그 위에
@aku 응답과 마찬가지로 확장 방법을 사용합니다.
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
하나의 행에서만 네임스페이스 이름의 일부를 기준으로 모든 클래스를 가져옵니다.
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
네임스페이스는 실제로 런타임 설계에 다소 수동적이며 주로 조직 도구 역할을 합니다..NET 형식의 전체 이름은 네임스페이스와 Class/Enum/Ec.를 결합하여 구성됩니다.특정 어셈블리만 통과하려는 경우 어셈블리에서 반환되는 유형을 반복하기만 하면 됩니다.내보내기 가져오기type 값을 확인하는 type()입니다.네임스페이스입니다.현재 AppDomain에 로드된 모든 어셈블리를 검토하려는 경우 AppDomain을 사용해야 합니다.현재 도메인.어셈블리 가져오기()
//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
아주 간단합니다.
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}
언급URL : https://stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via-reflection
'programing' 카테고리의 다른 글
정수.파스 - 더 좋은 방법? (0) | 2023.05.20 |
---|---|
mongodb 반환 개체를 사전으로 변환 (0) | 2023.05.20 |
Windows Azure란 무엇입니까? (0) | 2023.05.20 |
WPF Numeric UpDown 컨트롤은 어디에 있습니까? (0) | 2023.05.20 |
Bump Version은 무엇의 약자입니까? (0) | 2023.05.20 |