gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:42:37 26 4
gpt4 key购买 nike

我在使用反射转储某些对象属性的例程中遇到此错误,类似于下面的代码。

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 为真的类型”到底是什么,更重要的是如何在没有 try/catch 的情况下避免此错误?

最佳答案

So what exactly is a "Type for which Type.IsGenericParameter is true"

这意味着它是开放泛型类型中的泛型类型参数——也就是说,我们还没有选择 T;例如:

// true
bool isGenParam = typeof(List<>).GetGenericArguments()[0].IsGenericParameter;

// false (T is System.Int32)
bool isGenParam = typeof(List<int>).GetGenericArguments()[0].IsGenericParameter;

所以;你有一些开放的泛型吗?也许您可以举例说明您从哪里获得 obj

关于c# - 只能在 Type.IsGenericParameter 为 true 的类型上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1346238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com