Base
의 변수가 전달 된 경우 "Base"를 반환하고 Derived
등으로 선언 된 경우 "파생 됨"을 반환하는 함수가 필요합니다. 할당 된 값의 런타임 유형에 의존하지 않습니다.C# 코드에서 변수가 선언 된 유형을 알아야합니다
답변
예를 들어 아래 코드를 참조하십시오. 핵심은 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);
}
}
도 올바른 결과를 산출합니다.
문제의 코드를 구문 분석하지 않으면 불가능합니다. 타입 정보
런타임시두 조각과, (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
입니다.
+1, btw, 실제는 "콘크리트"유형이라고합니다 ... –
값에 관심이 없었습니다. 유형 변수의 이름 만 선언되었습니다. 어쨌든 유용한 정보입니다. – Misha
+1에 대한 경고 –
- 1. 왜 함수 밖에서 선언 된 변수가 null입니까?
- 2. 구조체 태그와 이름, 지역 변수가 이름으로 선언 된 이유는 무엇입니까?
- 3. 어떤 상황에서 '필드 사용'에서 '_var'로 선언 된 인스턴스 변수가 비공개입니까?
- 4. jquery 변수가 선언 된 값을 전달할 수 없습니다.
- 5. 코드에서 수행 된 변경 감지
- 6. 코드에서 데이터 형식 안에 선언 된 컨트롤을 열거합니까?
- 7. C에서 변수가 속한 유형을 찾을 수 있습니까?
- 8. 정적 클래스 멤버로 선언 된 C++ 클래스
- 9. 함수 내에서 선언 된 상호 C++ 클래스
- 10. 이 C# 코드에서 유형을 검사 할 수있는 대안이 있습니까?
- 11. @implementation에 선언 된 변수
- 12. 자바 코드에서 응용 프로그램의 유형을 감지하는 방법
- 13. 내 knockout 코드에서 "변수가 정의되지 않았습니다."
- 14. Fortran에서 파생 된 유형을 C++로 전달
- 15. C++ 코드에서 C 구조 초기화
- 16. 클래스가 자동으로 선언 된 메서드가 선언 되었습니까?
- 17. Visual Studio에서 변수의 주소를 알아야합니다.
- 18. C 코드에서
- 19. C++에 포함 된 C 헤더의 전달 선언 열거 형
- 20. C++ 선언 된 클래스 외부에서 전역 적으로 선언 된 enum을 사용할 수없는 이유는 무엇입니까?
- 21. 내 코드에서 C
- 22. 나는 오라클 데이터베이스에 선언 된 유형이
- 23. "좌표계에서 로컬로"함수를 알아야합니다.
- 24. 로직 디자인을 알아야합니다 - help
- 25. 워크 플로우 ID를 알아야합니다
- 26. 아코디언이 무너질 때를 알아야합니다.
- 27. C#을 선언
- 28. c 선언 및 초기화
- 29. C++ const 참조 선언
- 30. C++ 포인터를 선언
Romans 두 번째 솔루션을 사용하는 경우 왜 'typeof (T)'를 사용하지 않는가? –
@Courtney :'string s = null;을 쓸 수 없다. s가 유형 또는 네임 스페이스의 이름이 아니기 때문에 Console.Write (typeof (s));' 컴파일되지 않습니다. –