0

出于测试目的,我想查看HttpApplication对象的所有属性及其对应的值(我正在测试 HTTPModule 的某些功能)。我的第一个想法是将其序列化为 XML,然后查看或将其写入文件。

问题是,HttpApplication不是可序列化的类,所以当我尝试序列化时会抛出异常。是否有任何其他技术,或者甚至有可能获得不可序列化对象的字符串表示形式?我只是想看看我使用 Intellisense 获得的所有相同属性及其值。

我看过一些提到反射的文章,但我没有发现任何表明它适用于我的场景的东西。

更新:

在收到几个回复后,看来我需要使用反射。这是我正在使用的代码:

Dim sProps As New StringBuilder
For Each p As System.Reflection.PropertyInfo In oHttpApp.GetType().GetProperties()
  If p.CanRead Then
    sProps.AppendLine(p.Name & ": " & p.GetValue(oHttpApp, Nothing))
  End If
Next

在我的 AppendLine 语句中,立即抛出异常:

System.InvalidCastException:未为字符串“上下文:”和类型“HttpContext”定义运算符“&”。在 Microsoft.VisualBasic.CompilerServices.Operators.InvokeObjectUserDefinedOperator(UserDefinedOperator Op, Object[] Arguments) 在 Microsoft.VisualBasic.CompilerServices.Operators.InvokeUserDefinedOperator(UserDefinedOperator Op, Object[] Arguments) 在 Microsoft.VisualBasic.CompilerServices.Operators.ConcatenateObject(Object左,对象右)

@granadaCoder,您提到我需要知道要“深入”到什么程度,我想知道这是否是问题所在。在上面的错误中,Context是一个复杂的对象,所以我需要深入研究它并获取它的各个属性,对吗?你知道我怎么能做到这一点 - 还是就像在我的循环中GetProperties再次调用一样简单?p

4

2 回答 2

2

听起来像是一个很好的反射用例——

如何遍历自定义 vb.net 对象的每个属性?

您可以遍历所有对象的属性并创建您自己的 XML/JSON 视图。

更新 -

这是我如何将任何对象转换为字典的 c# 代码(适用于您的用例)

    public static Dictionary<string,string> ToDictionary<T>(this T me, string prefix=null) where T:class
    {
        Dictionary<string, string> res = new Dictionary<string, string>();

        if (me == null) return res;


        var bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.GetField;
        var properties = me.GetType().GetProperties(bindingFlags)
            .Where(i => i.CanRead
            );

        foreach (var i in properties)
        {
            var val = i.GetValue(me, null);
            var str = "";
            if (val != null)
                str = val.ToString();
            res[string.Format("{0}{1}", prefix, i.Name)] = str;
        }
        return res;
    }
于 2013-02-22T15:54:49.923 回答
1

有些对象并不意味着可序列化。以 IDataReader 为例。

你将不得不进行反思。并“剔除”可读的属性。

这是一些入门代码。

  private void ReadSomeProperties( SomeNonSerializableObject myObject ) 
  {

     foreach( PropertyInfo pi in myObject.GetType( ).GetProperties( BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty) ) 
     {
     //pi.Name
     //pi.GetValue( myObject, null )
     //don't forget , some properties may only have "setters", look at PropertyInfo.CanRead
     }

  }

当然,当属性是复杂对象(不是标量)时,您必须弄清楚您想要挖掘多“深”。

于 2013-02-22T16:02:50.403 回答