我在一个使用反射来转储一些对象属性的例程中得到这个错误,类似于下面的代码。
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为true的类型上调用”。
在此阶段,调试器中的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为真的类型”,更重要的是,我如何在没有尝试/捕获的情况下避免这个错误?
发布于 2009-08-28 11:13:08
所有的线索都在里面。obj的类型是Type
类本身(或者更确切地说,是奇怪的RuntimeType派生)。
在故障点,您的循环已经到达了名为DeclaringMethod
的Type
类属性。但是,这个Type
类的实例描述的类型是System.Data.SqlClient.SqlConnection
,它不是方法的泛型类型。
因此,尝试调用DeclaringMethod上的get会导致异常。
关键是您正在检查类Type
的类型。这有点循环,但想一想这个:
SqlConnection s = new SqlConnection();
Type t = s.GetType()
Type ouch = t.GetType()
类ouch描述的是什么?
发布于 2018-12-26 15:33:52
我的问题得到了解决,方法是删除模型中的重复字段和表,并在Model.edmx文件中定义查询和删除的存储。
https://stackoverflow.com/questions/1346238
复制相似问题