리플렉션을 사용하여 아래 코드와 같은 일부 개체 속성을 덤프하는 루틴에서이 오류가 발생합니다.Type.IsGenericParameter가 참인 Type에서만 메서드를 호출 할 수 있습니다.
MemberInfo[] members = obj.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance) ;
foreach (MemberInfo m in members)
{
PropertyInfo p = m as PropertyInfo;
if (p != null)
{
object po = p.GetValue(obj, null);
...
}
}
실제 에러는 "단 Type.IsGenericParameter 해당하는 해당하는 유형이라고 할 수있다 방법."의 내부 예외 "호출 대상이 예외가 발생 된" 디버거 OBJ이 단계에서
가 표시 OBJ가 타입 System.RuntimeType
있어서의 m은 {}이다 System.Reflection.MethodBase DeclaringMethod
참고로
{Name = "SqlConnection" FullName = "System.Data.SqlClient.SqlConnection"}
로서 (System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) typeof (System.Data.SqlClient.SqlConnection) typeof (System.Reflection.BindingFlags.Instance) 만 65를 반환하는 반면에 System.RuntimeType 형식의 멤버는 188 개 항목을 포함합니다.
obj와 p.PropertyType에서 모두 isGenericParameter를 검사하려고 시도했지만, p.GetValue가 작동하는 대부분의 속성에 대해서는 false 인 것으로 보입니다.
정확히 "Type.IsGenericParameter가 참인 유형"이고 더 중요한 것은 시도/catch없이이 오류가 발생하지 않도록하려면 어떻게해야합니까? 우리가 T
포착되지 않은 즉, -
나는 빛을 볼 생각입니다 . p.GetValue는 'Type.IsGenericParameter가 참인 Type에 대해서만 호출 할 수 있습니다'라는 것이 아니라 p로 표시되는 기본 속성 (이 경우 DeclaringMethod)이 호출 될 수 있다는 것을 말하는 것은 아닙니다. Type.IsGenericParameter is 참된. – sgmoore
정확히 "호출 대상에 의해 예외가 발생했습니다"는 의미입니다.이 경우 "호출 대상"은 DeclaringMethod 속성 가져 오기 도구이며, 읽음으로써 동일한 IsGenericParameter 예외가 발생합니다 'obj.DeclaringMethod'를 직접 호출하십시오. – stevemegson
나는 이것이 가장 도움이 되었기 때문에이 대답을 필자의 받아 들인 대답으로 표시했다. 그러나 진실로 대부분의 다른 답변들도 도움이되었다. 그래서 모두에게 감사합니다. – sgmoore