C#Reflection从ICollection获取值

时间:2015-02-18 14:59:49

标签: c# reflection sqlexception

我正在努力解决问题,我无法找到解决方案。

在我的代码的某个时刻,会抛出SqlException

我创建了一个使用反射的方法来迭代任何异常的所有属性并执行一些逻辑,但我遇到了这个问题。

其成员之一致电Errors,继承自SqlErrorCollection。 (根据MSDN文档,类定义是

[SerializableAttribute]
[ListBindableAttribute(false)]
public sealed class SqlErrorCollection : ICollection, 

我用来检查属性是否为列表的代码不适用于此属性:

if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)
    && typeof(ICollection).IsAssignableFrom(prop.PropertyType)
    && prop.PropertyType.IsGenericType)

当我使用下面的代码得到它时

property.GetValue(myObject, null);

引发了TargetParameterCountException(参数计数不匹配)。

任何人都知道为什么?

3 个答案:

答案 0 :(得分:3)

循环遍历SqlException中的错误非常容易。如果这就是你所追求的,那你就去吧。

private string GenerateMessage(SqlException ex)
{
    StringBuilder builder = new StringBuilder();
    foreach (SqlError error in ex.Errors)
    {
        builder.Append(error.ToString());
    }

    return builder.ToString();
}

答案 1 :(得分:1)

prop.PropertyType.IsGenericType检查将返回false,因为SqlErrorsCollection是非泛型的。至于问题的第二部分 - 我在获取属性值时无法重现此异常。以下代码执行时没有例外:

// create inner sql error collection instance through reflection
var sqlErrorCollCtor = typeof(SqlErrorCollection).GetConstructors(
  BindingFlags.Instance 
| BindingFlags.NonPublic 
| BindingFlags.NonPublic).FirstOrDefault();

var errorCollection = (SqlErrorCollection)sqlErrorCollCtor.Invoke(null);

// create sql exception instance through reflection
var sqlExceptionCtor = typeof(SqlException).GetConstructors(
  BindingFlags.Instance 
| BindingFlags.NonPublic 
| BindingFlags.NonPublic).FirstOrDefault();

var exception = sqlExceptionCtor.Invoke(
  new object[] { "Test", errorCollection, null, new Guid() });

// retrieve Errors property
var prop = exception.GetType().GetProperty("Errors");

if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)
    && typeof(ICollection).IsAssignableFrom(prop.PropertyType) )
    // && prop.PropertyType.IsGenericType)
{
    var val = prop.GetValue(exception, null);
    Console.WriteLine(val);
}

可能是您从另一个对象检索值,而不是SqlException?

答案 2 :(得分:0)

由于pmcoltrane提供的洞察力,Error属性是一个索引属性。文章iterating through an indexed property (Reflection)帮助解决了我的问题。

感谢您的帮助