2009-11-23 4 views
7

Base의 변수가 전달 된 경우 "Base"를 반환하고 Derived 등으로 선언 된 경우 "파생 됨"을 반환하는 함수가 필요합니다. 할당 된 값의 런타임 유형에 의존하지 않습니다.C# 코드에서 변수가 선언 된 유형을 알아야합니다

+0

Romans 두 번째 솔루션을 사용하는 경우 왜 'typeof (T)'를 사용하지 않는가? –

+0

@Courtney :'string s = null;을 쓸 수 없다. s가 유형 또는 네임 스페이스의 이름이 아니기 때문에 Console.Write (typeof (s));' 컴파일되지 않습니다. –

답변

15

예를 들어 아래 코드를 참조하십시오. 핵심은 Generics을 사용하는 것입니다. 확장 구문은 멋진 구문에 사용되었습니다.

using System; 

static class Program 
{ 
    public static Type GetDeclaredType<T>(this T obj) 
    { 
     return typeof(T); 
    } 

    // Demonstrate how GetDeclaredType works 
    static void Main(string[] args) 
    { 
     ICollection iCollection = new List<string>(); 
     IEnumerable iEnumerable = new List<string>(); 
     IList<string> iList = new List<string>(); 
     List<string> list = null; 

     Type[] types = new Type[]{ 
      iCollection.GetDeclaredType(), 
      iEnumerable.GetDeclaredType(), 
      iList.GetDeclaredType(), 
      list.GetDeclaredType() 
     }; 

     foreach (Type t in types) 
      Console.WriteLine(t.Name); 
    } 
} 

결과 :

ICollection 
IEnumerable 
IList`1 
List`1 

편집 : 또한 그것이 모든 인텔리 드롭 다운 목록에 나타나도록하는 것처럼, 여기에 확장 메서드를 사용하지 않도록 할 수 있습니다. 다른 예 :

using System; 
using System.Collections; 

static class Program 
{ 
    public static Type GetDeclaredType<T>(T obj) 
    { 
     return typeof(T); 
    } 

    static void Main(string[] args) 
    { 
     ICollection iCollection = new List<string>(); 
     IEnumerable iEnumerable = new List<string>(); 

     Type[] types = new Type[]{ 
       GetDeclaredType(iCollection), 
       GetDeclaredType(iEnumerable) 
     }; 

     foreach (Type t in types) 
      Console.WriteLine(t.Name); 
    } 
} 

도 올바른 결과를 산출합니다.

+1

+1. 부드러운! (15 자 제한을 채우십시오) – Heinzi

+0

와우! 고마워요 !!! – Misha

+1

제 2의 솔루션을 사용하겠습니다. (편집에서) – Misha

2

개체에 도달 할 때까지 GetType()을 반복해서 실행하면됩니다.

+1

예,이 작업을 수행했지만 천천히 작동합니다. – Misha

4

문제의 코드를 구문 분석하지 않으면 불가능합니다. 타입 정보

런타임시

두 조각과, (object.GetType()를 통해), 값의 실제 형 가능 해당 변수는 매개 변수 또는 클래스/인스턴스 변수 FieldType 구내이면 FieldInfo, PropertyInfo에 PropertyType, ParameterInfo에 ParameterType.

전달 된 값이 경로에 여러 변수를 통해 왔을 수도 있으므로 질문이 잘 정의되지 않은 것 같습니다. 두려워합니다.

아 - 내가 메서드에서 현재 정의 된 형식 만 원한다면 Expression 기능이이를 제공합니다 (Roman의 대답은이 작업을 수행 할 수있는 깔끔한 방법을 보여줍니다). 그러나 메서드 외부에서이를 사용하려고합니다. 에센스를 사용하면 컴파일러의 일반적인 유형 유추가 문제의 유형을 추론하지만 이는 사용되는 변수가 이 아니라 항상 볼 수있는 변수라는 것을 의미합니다. 대신, 예를 들면, 컴파일러 합성 변수의 수있다 : X는 컴파일러에게 오브젝트 참조를 배치하여 임시 변수 synthesises

string x = "x"; 
Console.WriteLine(x.GetDeclaredType()); // string 
Console.WriteLine(((object)x).GetDeclaredType()); // object 

입니다.

+0

+1, btw, 실제는 "콘크리트"유형이라고합니다 ... –

+0

값에 관심이 없었습니다. 유형 변수의 이름 만 선언되었습니다. 어쨌든 유용한 정보입니다. – Misha

+0

+1에 대한 경고 –

관련 문제