2013-04-30 3 views
0

리플렉션을 사용하여 개체의 속성을 읽습니다.개체를 값 형식 배열로 캐스팅합니다.

내가 읽은 값이 참조 유형 (예 : String []) 인 경우이를 Object [] 배열로 캐스팅하고 배열의 문자열을 반복 할 수 있습니다.

String[] Workers = { "Steve", "Sally", "Jim" }; 
    Object SomeValue = Workers; 
    // Prented that SomeValue is returned from reflection   
    List<Object> SomeList = new List<Object>((Object[])SomeValue); 

그러나 객체가 값 유형의 배열 인 경우 배열로 다시 채울 수 없습니다. 나는 모든 것을 시도했다. 어떤 이유로 든 C#이 ValueType 배열로 재 작성되지는 않습니다 (아마도 작동 할 것이라고 생각했습니다).

Int32[] WorkingHours = { 1, 2, 65, 6 }; 
    Object SomeValue = WorkingHours; 
    // Prented that SomeValue is returned from reflection 
    List<Object> SomeList = new List<Object>((ValueType[])SomeValue); 

의견이 있으십니까?

+0

당신'(IEnumerable을 ) SomeValue'을 시도했다가? – Damith

답변

4

# 왜냐하면 어떤 이유로 # ValueType 배열로 다시 채우지 않을 것입니다.

아니요, 표현이이 아니기 때문에 작동하지 않습니다.

참조 유형 배열에 대해 공분산이 작동하는 이유는 참조의 표현이 참조하는 객체의 유형에 관계없이 참조 표현이 동일하다는 것입니다. 값 유형과 참조 유형을 비교하는 경우 이 아닌입니다. 예를 들어

는 고려 :

byte[] x = { 1, 2, 3, 4 }; 

x의 각 요소는 단지 바이트입니다. 해당 배열을 object[]으로 볼 수 없습니다. 각 요소는 단순히 참조가 아닙니다.

그러나 비교적 쉽게 권투를 통해 각 요소를 변환 방법 목록을 만들 수 있습니다

List<Object> list = ((IEnumerable) WorkingHours).Cast<Object>().ToList(); 
+0

완벽한 - 그게 내가 찾고 있었지만, 정말 그것을 얻을 수 없었다, 감사합니다! –

관련 문제