Recibo este error en una rutina que utiliza la reflexión para volcar algunas propiedades de objeto, algo así como el código siguiente.El método solo se puede invocar en un tipo para el que Type.IsGenericParameter es verdadero
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);
...
}
}
el error real es "se inició una excepción por el destino de una invocación" con una excepción interior del "método puede ser llamado sólo en un tipo para el que Type.IsGenericParameter es verdadero".
En esta etapa en el obj depurador aparece como
{Name = "SqlConnection" FullName = "System.Data.SqlClient.SqlConnection"}
con el System.RuntimeType tipo
El método m es {System.Reflection.MethodBase DeclaringMethod}
Nota que obj es del tipo System.RuntimeType y sus miembros contiene 188 elementos, mientras que un tipo simple de (System.Data.SqlClient.SqlConnection) .GetMembers (System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) solo devuelve 65.
Intenté comprobar isGenericParameter tanto en obj como en p.PropertyType, pero esto parece ser falso para la mayoría de las propiedades, incluidas aquellas donde funciona p.GetValue.
Entonces, ¿qué es exactamente un "Tipo para el que Type.IsGenericParameter es verdadero" y más importante aún ¿cómo puedo evitar este error sin intentar/atrapar?
Creo que estoy empezando a ver la luz . No está diciendo que p.GetValue puede 'solo invocar un tipo para el que Type.IsGenericParameter es verdadero', sino que la propiedad subyacente representada por p, que en este caso es DeclaringMethod, solo se puede llamar es Type.IsGenericParameter es cierto. – sgmoore
Exactamente: eso es lo que "Excepción ha sido lanzada por el objetivo de una invocación" significa, el "objetivo de una invocación" en este caso es el getter de propiedad 'DeclaringMethod', y usted obtendría la misma excepción' IsGenericParameter' al leer 'obj.DeclaringMethod' directamente. – stevemegson
He marcado esta respuesta como mi respuesta aceptada, ya que fue la más útil, pero en realidad la mayoría de las otras respuestas me ayudaron también. Así que gracias a todos. – sgmoore