Viene visualizzato questo errore in una routine che utilizza la riflessione per scaricare alcune proprietà dell'oggetto, ad esempio il codice seguente.Il metodo può essere chiamato solo su un tipo per cui Type.IsGenericParameter è true
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);
...
}
}
L'errore effettivo è "eccezione è stata generata dalla destinazione di una chiamata" con un'eccezione interna "Metodo può essere chiamato solo su un tipo per il quale Type.IsGenericParameter è vero."
In questa fase nel obj debugger appare come
{Name = "SqlConnection" FullName = "System.Data.SqlClient.SqlConnection"}
al tipo System.RuntimeType
Il metodo m è {System.Reflection.MethodBase DeclaringMethod}
noti che obj è di tipo System.RuntimeType e membri contiene 188 elementi mentre un semplice tipo (System.Data.SqlClient.SqlConnection) .GetMembers (System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) restituisce solo 65.
Ho provato a verificare isGenericParameter su obj e p.PropertyType, ma questo sembra essere falso per la maggior parte delle proprietà, incluse quelle in cui p.GetValue funziona.
Quindi, qual è esattamente un "Tipo per cui Type.IsGenericParameter è true" e, ancora più importante, come evitare questo errore senza try/catch?
Penso che sto cominciando a vedere la luce . Non sta dicendo che p.GetValue puo 'solo chiamare su un tipo per cui Type.IsGenericParameter è vero' ma piuttosto che la proprietà sottostante rappresentata da p, che in questo caso è DeclaringMethod, può essere chiamata solo è Type.IsGenericParameter è vero. – sgmoore
Esattamente - questo è ciò che "l'eccezione è stata lanciata dalla destinazione di un'invocazione" significa che la "destinazione di un'invocazione" in questo caso è il getter della proprietà 'DeclaringMethod', e si otterrebbe la stessa eccezione di' IsGenericParameter' leggendo 'obj.DeclaringMethod' direttamente. – stevemegson
Ho contrassegnato questa risposta come la mia risposta accettata in quanto è stata la più utile, ma in realtà la maggior parte delle altre risposte ha aiutato pure. Quindi grazie a tutti. – sgmoore