首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法只能在Type.IsGenericParameter为true的类型上调用

方法只能在Type.IsGenericParameter为true的类型上调用
EN

Stack Overflow用户
提问于 2009-08-28 10:42:24
回答 2查看 61.3K关注 0票数 20

我在一个使用反射来转储一些对象属性的例程中得到这个错误,类似于下面的代码。

代码语言:javascript
运行
复制
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显示为

代码语言:javascript
运行
复制
  {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为真的类型”,更重要的是,我如何在没有尝试/捕获的情况下避免这个错误?

EN

回答 2

Stack Overflow用户

发布于 2009-08-28 11:13:08

所有的线索都在里面。obj的类型是Type类本身(或者更确切地说,是奇怪的RuntimeType派生)。

在故障点,您的循环已经到达了名为DeclaringMethodType类属性。但是,这个Type类的实例描述的类型是System.Data.SqlClient.SqlConnection,它不是方法的泛型类型。

因此,尝试调用DeclaringMethod上的get会导致异常。

关键是您正在检查类Type的类型。这有点循环,但想一想这个:

代码语言:javascript
运行
复制
SqlConnection s = new SqlConnection();
Type t = s.GetType()
Type ouch = t.GetType()

类ouch描述的是什么?

票数 3
EN

Stack Overflow用户

发布于 2018-12-26 15:33:52

我的问题得到了解决,方法是删除模型中的重复字段和表,并在Model.edmx文件中定义查询和删除的存储。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1346238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档