2013-02-14 2 views
0

의 실제 유형 가져 오기 :이 예를 지정된 배열

IColor[] items; 
items = new IColour[]{ new SomeColour() }; 

을 어떻게 항목을 살펴보고 typeof(SomeColour)보다는 typeof(IColour)를 얻기 위해 반사를 사용합니까? 내가 익숙한 것을 사용하면 typeof(items).GetElementType()은 실제 타입이 아니라 IColour이된다.

+0

에 쓰여있는 말은 그대로 단지 예입니다 모든 항목의 유형의 (에 GetType을()), 가장 구체적인 유형을 얻습니다. – leppie

+3

@ DeX3r : 그것도 컴파일 – leppie

+0

typeof (items) .GetElementType(). 내 머리 꼭대기에서 DeclaringType이 응답을 게시하지 않도록 – Dreamwalker

답변

5

당신이 원하는 것은 불가능합니다. 배열은 각각 다른 구체적인 유형을 가진 여러 항목을 저장할 수 있습니다.

배열 종류는 IColor입니다. 인덱스 0에 저장된 항목의 유형은 SomeColour입니다. 두 번째 항목을 배열에 추가 한 경우 : AnotherColouritems의 유형은 무엇입니까?

items[index].GetType()을 사용하여 배열에 저장된 항목의 유형을 얻을 수 있습니다. 여기서 index은 배열의 위치를 ​​가리 킵니다.

+0

감사. 그 대답은 다음과 같습니다. 1) 빈 배열에서 수행 할 수 없습니다. 2) 배열의 모든 요소가 동일한 구체화 유형이라고 가정한다면, 첫 번째 요소의 형식을 배열, 그렇지 않으면 3) 각 배열의 유형을 얻기 위해 배열 전체를 반복해야합니다. –

+0

모든 요소의 유형이 동일한 경우 배열의 유형을보다 구체적인 유형으로 변경할 수도 있습니다. 배열이 SomeColour []이면, SomeColour가 배열 타입이됩니다. 모든 요소의 유형이 동일하지 않을 경우 전체 배열에 대해 하나의 특정 유형이 존재하지 않습니다. –

+0

오, 확실히이 경우 IColour의 각기 다른 구현이있는 컨테이너 클래스를 인스턴스화하고 있습니다. UI에 대한이 말도 안되는 말을하고 있습니다 (Unity3D이므로 특정 ' 내가 너무 공상에 빠지도록). –

0

typeof(items).GetElementType IS IColor입니다. 이는 IColor의 목록이기 때문입니다.

특정 요소를 기본 유형 얻으려면 : 당신이 IColor[]이있는 경우

IColor item = items[<someIdx>]; 
item.GetType(); 
0

을, 당신은 "실제 유형"에 대해 말할 수있는 유일한 방법은 다음과 같습니다 IColor.

class Foo : IColor {...} 
class Bar : IColor {...} 

을 2 Foo 3 BarIColor[] 배열을 예를 들어, 당신은 할 수 있습니다. 자 : "유형"은 무엇입니까?

var type = items[0].GetType(); 

을하지만 데이터가 이종 경우 그 도움이되지 않습니다 :

배열이 비어 있지 않은 경우, 당신은 첫 번째 항목, 말, 볼 수 있었다. 당신은 별개의 유형을 확인하고 균일 한 것으로 판명 희망 수 :

var type = items.Select(x => x.GetType()).Single(); 
1

어쩌면이?

foreach (var item in items) 
{ 
    var t = item.GetType(); 
} 

t가 SomeColur해야한다, OtherColur 등

0

이 @Wouter 드 kort 그룹

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     IColour[] items; 
     items = new IColour[] { new SomeColour(), new SomeOtherColour() }; 

     Console.WriteLine(items.GetType().GetElementType().Name); // Will always return IColour 

     foreach (var item in items) 
     { 
      Console.WriteLine(item.GetType().Name); // Will return the name of type added with the IColour interface 
     } 

     Console.ReadLine(); 
    } 
} 

internal interface IColour 
{ } 

internal class SomeColour : IColour 
{ } 

internal class SomeOtherColour : IColour 
{ }