2011-04-18 5 views
1

이 질문을 잘 수행하는 방법을 잘 모르겠습니다. 그것이 불분명하면 죄송합니다. 개체의 실제 유형이 아니라 개체가 작동하는 유형을 결정하려고합니다. C# 개체 유형 결정

내가이 두 클래스 말해봐 ... ...

public class A{ 
    public A() { 
     string thisTypeName = this.GetType().???; // the value I'm looking for here is "A" not "B" 
    } 
} 

public class B : A { } 

내가 원하지 않는 것은을

string thisTypeName = this.GetType().BaseType.Name; 

때문에 나는 ...이 작업을 수행하기로 결정한 경우

public class C : B { } 

... then this this.GetType(). BaseType이 A.이 아닌 B 클래스를 참조합니다.

기본 제공 방법이 있나요? 아마도 내가 원하는 것을 할 Type에 확장 메서드를 작성할 수있을 것이라고 추측합니다.

+0

을'문자열 thisTypeName = typeof (A)' –

+0

클래스의 코드에 들어 있기 때문에 _this_ 타입을 이미 알고 있다면 왜 GetType()과 같은 메소드에서 그것을 얻으려고 하는가? –

+0

정확히 어떤 유형입니까? 모든 클래스는'Object' 클래스를 상속합니다. 그래서 모든 클래스의 "가장 기본"클래스가됩니다. 'Object'가 아닌 '대부분의 기본 클래스'를 원하십니까? 같은 어셈블리에서 "가장 기본"클래스를 원하십니까? – Guffa

답변

0
public static Type GetActualBaseType(this object obj) 
    { 
     Type type = obj.GetType(); 

     while (type.IsNested) 
      type = type.BaseType; 

     return type; 
    } 

당신이 스택 프레임을 얻을 수

+0

이것은 올바른 방향으로 나아가는 단계이지만 반드시 "가장 기본"유형을 항상 원하는 것은 아닙니다. 내가이 일을하고 있다고 해 .GetType(). ??? 생성자 내부에서 A 대신 B로; 이 경우에는 this.GetType()을 원할 것입니다. ??? B 형에 대한 참조를 돌려 주려고. – Tbabs

+0

실제로 원하니? OP에서 당신은 C#에서 "middle type" – bevacqua

0

당신은 System.Diagnostics.StackTrace를 사용할 수 있다는 것을 사용하려고 시도하고 현재의 방법에 대한 DeclaringType 얻을 수 :

var st = new StackTrace(); 
Console.WriteLine(st.GetFrame(0).GetMethod().DeclaringType.ToString()); 
4

이 중 일부를 시계를 지금 당신이 얻고있는 조언. 그 중 일부는 내 책에서 냄새가 심하다.

당신은 사용할 :

typeof(A).IsAssigneableFrom(aninstance.GetType()); 

이 유형은 baseType 여기서에서 파생되어 있는지 여부를 를 결정하기 위해 또는 인터페이스

참조 구현 : http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx을. 이 페이지에는 지원되는 모든 미묘한 사례를 보여주는 재미있는 예제가 있습니다.

0

특정 클래스 인스턴스의 유형 문자열이 필요하거나 특정 기본 클래스의 다른 하위 유형을 처리하는 방법을 알고 싶습니까? 후자의 경우

는,이처럼 is 키워드를 사용하는 것이 아마도 더 나은 :

class A {} 
class B : A {} 
class C : B {} 
class Aaa : A {} 

// NB: order of if() statements is important below, start with most specific ones 
public void doSomething(A obj) { 
    if(obj is Aaa) { 
    // do something specific for Aaa 
    } else if(obj is C) { 
    // do something specific for C 
    } else if(obj is B) { 
    // do something specific for B 
    } else { 
    // do general A stuff 
    } 
} 

이 당신이 가고하려고했던 곳이다 만약 내가 아무 생각이 없지만, 문제에서 당신을 제기하고 기본 클래스의 이름을 얻는 것이 실제 문제가 아니라는 점을 분명히 설명합니다.

+0

을 원하지 않는다고 말했고, 불가능할 경우 null을 반환하는 동적 캐스트를 수행하기 위해'obj is Aaa' 또는'obj as Aaa'를 읽어야합니다. – sehe

0

당신은 컴파일 타임에 알려져있다 찾고있는 것 같다 무엇 :

는 B의 ctor에 당신은 당신이 A 형을 원하는의 ctor에있는 B 형

을 원하는 ...

그래서 당신은 단순히 typeof(A), typeof(B)을 쓸 수 등

현재 방법을 선언 반사에 의한 유형 얻으려면 : 당신은 그냥 사용할 수 있습니다 귀하의 예제에서

MethodBase.GetCurrentMethod().DeclaringType