2017-11-09 20 views
0

동적 유형의 필드가있는 배열을 구체화하는 데 Activator.CreateInstance()을 사용하려고합니다. 배열 필드에 동적 유형을 사용해야합니다. 런타임은 Type arrayType = arrayFieldType.MakeArrayType()).동적 유형 (런타임 바인딩) 배열을 인스턴스화 할 때 RuntimeBinderException

singleSet.ZaznamyObjektu = Activator.CreateInstance(arrayType, new object[] { rowCount }); 

내가 How do I create a C# array using Reflection and only type info?에 따라이 방법을 선택했습니다. (rowCount는 정수) 그러나 그것은 나에게 RuntimeBinderException주고 유지 :

암시 'PodperneZarizeniTypeZaznamObjektu []'에 유형 '개체'변환 할 수 없습니다 있습니다. 명시 적 변환이 존재합니다 (캐스트를 놓치셨습니까?)

그러나 형식의 정확한 이름을 사용할 수없는 경우 형 변환 또는 변환하는 방법을 모르겠습니다. 또한 Array.CreateInstance()를 사용하려고했지만 그것은 나에게 유사한 예외주고 있었다 :

암시 'PodperneZarizeniTypeZaznamObjektu []'에 유형 'System.Array'을 변환 할 수 없습니다 있습니다. 명시 적 변환 (? 당신은 캐스트를 누락)이 존재

+0

'singleSet.ZaznamyObjektu'의 유형은 무엇입니까? – InBetween

+0

PodperneZarizeniTypeZaznamObjektu [] –

답변

0

그러나 그것은 나에게 RuntimeBinderException을주고 계속 :

암시 'PodperneZarizeniTypeZaznamObjektu []'에 유형 '개체'변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?)

이는 런타임 예외로 보이지 않습니다. 컴파일 시간 오류처럼 보입니다.

의견에서 singleSet.ZaznamyObjektu의 유형은 PodperneZarizeniTypeZaznamObjektu[]입니다. Activator.CreateInstanceobject을 반환하며 은 에 대해 유형에 유효합니다. 배열 형식의 속성에 object을 할당 할 수 없습니다. 이것은 다음과 같은 시나리오에서 비참하게 실패 할, 메모를 할 지금

singleSet.ZaznamyObjektu = (PodperneZarizeniTypeZaznamObjektu[])Activator.CreateInstance(arrayType, new object[] { rowCount }); 

:

  1. arrayField입니다

    귀하의 문제는 단순히 캐스트를 누락 것 같다 참조 유형이고 arrayFieldPodperneZarizeniTypeZaznamObjektu 사이에 유효성 확인 보존 참조 변환이 없습니다.

    (Mammal[])tigers; //valid 
    (Insect[])tigers; //evidently not. 
    
  2. arrayField치형하며 그 종류 PodperneZarizeniTypeZaznamObjektu의 타입이다. 암시 적/명시 적 형변환 연산자가 있더라도 실패합니다. 배열 유형 분산은 값 유형에 허용되지 않습니다.

    (long[])(ints); //not valid even though an implicit cast 
           //from int to long exists 
    
+0

고마워요! 더 많은 것을 해결하려고 노력할수록 (https://stackoverflow.com/questions/21345821/cast-with-a-type-variable 및 여기에 작성한 내용 등으로 인해) 실제로는 불가능하다는 것을 알게됩니다. 마지막 기회는 인스턴스화되는 가능한 각 클래스에 대해 별도의 형변환을 작성하는 것입니다. –