Я получаю эту ошибку в подпрограмме, которая использует отражение, чтобы сбросить некоторые свойства объекта, что-то вроде кода ниже.
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.
Я пробовал проверять isGenericParameter как на obj, так и на p.PropertyType, но это кажется ложным для большинства свойств, в том числе тех, где p.GetValue работает.
Так что же такое "Тип, для которого Type.IsGenericParameter является истинным" и что более важно как избежать этой ошибки без try/catch?