2010-04-23 5 views
2

.NET 4 프레임 워크는 Assembly.IsDynamic 메서드를 제공하지만 .NET 2.0/3.5에서는 그렇지 않습니다..NET 유형이 동적인지 확인 (Reflection.Emit을 사용하여 생성)

사용 사례는 간단합니다 : 로깅 목적으로 동적 프록시에 의해 랩핑 될 수있는 엔티티의 기본 유형 이름을 결정하고 싶습니다 (프록시에 대해 알고있는) NHibernate 또는 Castle에 대한 참조가없는

예를 들어 CatProxYadaYada 일 수도 있지만 Cat에 관심이 있습니다.

그 유형을 얻는 가장 쉬운 방법은 무엇입니까? 나는이 골격의 생각 : 어셈블리가 Emit 사용하여 생성 된 경우

var type = obj.GetType(); 
while (IsProxy_Dynamic_Whatever(obj)) 
    type = type.BaseType; 
return type; 
+0

이것은 프록시가 제공하는 추상화를 깨뜨린 것인데, 그 주된 아이디어는 소비자가 차이점에 대해 알거나 신경 쓰지 않아야한다는 것입니다. 어떤 종류의 벌목을하고 있는지 알고 싶습니다. – Aaronaught

+0

@Aaronaught, 그냥 "Cat # 324 유효성 검사에 실패했습니다"와 같은 항목을 기록하려고합니다.이 방법은 내 Entity 클래스에서 상속 한 객체를 전달합니다. 즉, 코드는 인스턴스가 Cat이라는 (프록시)인지 여부조차 모릅니다. 내가 관심있는 것은 실제로 유형이 아니라 유형 * 이름 *입니다. –

답변

4

, 다음 종류의 조립이 AssemblyBuilder 경우 확인하여이를 확인 할 수 있어야한다. 즉, 다음과 같은 것입니다 :

static Type GetNonEmittedType(Type t) 
{ 
    if (t.Assembly is AssemblyBuilder) 
     return GetNonEmittedType(t.BaseType); 
    return t; 
} 

이것은 모든 종류의 동적 프록시에서 작동하지 않을 수 있습니다. 실제로 생성 된 방식에 따라 달라질 수 있습니다. 하지만 Emit과 작동합니다.

+0

고마워요! 그거야. –

관련 문제