2014-04-14 3 views
3

라이브러리 및 콘솔 프로그램이 있습니다. 프로그램이 동적으로 라이브러리를로드합니다. 라이브러리에 바이트 배열이 있습니다. 나는이 배열을 얻으려고 노력한다. 프로그램에서 :'System.Reflection.RuntimePropertyInfo'형식의 개체를 캐스팅 할 수 없습니다.

MemberInfo[] ByteArrayFile = HtmlPackage.GetMember("HtmlFile"); 
FieldInfo field; 
try 
{ 
    field = (FieldInfo)ByteArrayFile[0];//throw exception here 
} 
catch (Exception e) 
{ 
    String err = e.ToString(); 
    throw e; 
} 
byte[] HtmlFileArray = (byte[])field.GetValue(htmlPackage); 

이 오류 던져 예외 :

"System.InvalidCastException : 'System.Reflection.FieldInfo'를 입력 유형 'System.Reflection.RuntimePropertyInfo'의 개체를 캐스팅 할 수 없습니다 \. 연구 \에서 N ... 그것은 고정 어떻게 그래서

?

+3

오류 메시지가 분명합니다. 'PropertyInfo' 또는'MemberInfo'로 캐스트하십시오. – leppie

답변

2

필드 (FieldInfo)와 속성 (PropertyInfo)하지 API를 공유 - 그래서 당신은 그것을 해결해야

byte[] HtmlFileArray = ((dynamic)htmlPackage).HtmlFile; 
:

MemberInfo member = ByteArrayFile[0]; 
byte[] HtmlFileArray; 
switch (member.MemberType) 
{ 
    case MemberTypes.Field: 
     HtmlFileArray = (byte[])(((FieldInfo)member).GetValue(htmlPackage)); 
     break; 
    case MemberTypes.Property: 
     HtmlFileArray = (byte[])(((PropertyInfo)member).GetValue(htmlPackage)); 
     break; 
    default: 
     throw new NotSupportedException(member.MemberType.ToString()); 
} 

그러나,이 훨씬 쉽게 (그리고보다 효율적으로 너무 (때문에) 전략 캐싱에, 추가 약점을 도입하지 않고)입니다

+0

감사합니다. – user3231442

관련 문제