我在使用反射轉儲某些對象屬性(如下面的代碼)的例程上收到此錯誤。只能在Type.IsGenericParameter爲true的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顯示爲
{Name = "SqlConnection" FullName = "System.Data.SqlClient.SqlConnection"}
與類型System.RuntimeType
的方法,m爲{System.Reflection.MethodBase DeclaringMethod}
注意obj是類型System.RuntimeType和成員包含188項,而簡單的 typeof(System.Data.SqlClient.SqlConnection).GetMembers(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)僅返回65.
我試着在obj和p.PropertyType上檢查isGenericParameter,但對於大多數屬性(包括p.GetValue工作的那些屬性),這似乎都是錯誤的。
那麼到底什麼是「Type.IsGenericParameter爲true的類型」,更重要的是 如果沒有try/catch,我該如何避免這個錯誤?
我想我已經開始看到光。這並不是說p.GetValue可以「只對Type.IsGenericParameter爲true的Type進行調用」,而是隻能調用由p表示的基礎屬性,在本例中爲DeclaringMethod,即Type.IsGenericParameter爲真正。 – sgmoore 2009-08-28 12:00:29
準確地說 - 這就是「調用目標拋出異常」的意思,在這種情況下,「調用的目標」是'DeclaringMethod'屬性獲取器,並且您將通過閱讀獲得相同的「IsGenericParameter」異常直接使用「obj.DeclaringMethod」。 – stevemegson 2009-08-28 13:02:18
我已經將這個答案標記爲我接受的答案,因爲它是最有幫助的,但實際上大多數其他答案也有幫助。謝謝大家。 – sgmoore 2009-08-28 13:26:40