는 저번에 자바로 했던 것의 C#판이다.
자바에서 어떤 패키지 내부의 클래스 이름을 가져오는 것은 (내가 다른 방법을 안찾아보기는 했지만) 패키지에 들어가서 자바 바이너리파일 이름을 가져오는 것으로 구현했지만, C#의 경우에는 네임스페이스를 가지고 내부 클래스들을 가지고올 수 있으므로 그렇게 하면 될 듯싶다.
당연한 얘기지만 리플렉션을 이용한다.
1. 현재 실행중인 어셈블리를 가져온다.
2. 1의 어셈블리에 정의되어 있는 모든 타입들을 가져온다.
3. 그중에서 특정 네임스페이스에 정의되어 있는 타입만 걸러낸다.
자바에서보다 훨씬 쉬워보인다. 코드로 보자.
[code language=”csharp”]
using System.Reflection;
using System.Collections.Generic;
…
static IList<Type> GetClasses(string nameSpace){
List<Type> typeList = new List<Type>();
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes()){
if(t.Namespace == nameSpace){
typeList.Add(t);
}
}
return typeList;
}
[/code]
자바에 비해서 상당히 간단하다 (….)
자바에서 Abstract를 걸러내었던 것과 비슷하게 C#에서도 똑같은 일을 할 수 있다. 단지, C#에서는 abstract, interface인지 아닌지 나타내는 값이 bool 타입의 읽기 전용 프로퍼티로 정의되어 있다.
따라서 객체를 생성할 수 있는(abstract도 아니고 interface가 아닌) 클래스만 불러오려면 위의 if문을 다음과 같이 수정하면 된다.
[code language=”csharp”]
t.Namespace == nameSpace && !t.IsAbstract
[/code]
답글 남기기