出于测试目的,我想查看HttpApplication
对象的所有属性及其对应值(我正在测试HTTPModule的一些功能)。我的第一个想法是将其序列化为XML,然后查看或将其写入文件。
问题是,HttpApplication
不是可序列化的类,因此当我尝试序列化时会抛出异常。是否有其他技术,或者甚至可以获得非序列化对象的字符串表示?我只想看到我使用Intellisense获得的所有相同属性及其值。
我看过一些提到反思的文章,但我没有找到任何暗示它适合我的情景的文章。
更新
在得到一些回复之后,看起来我需要使用Reflection。这是我正在使用的代码:
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:Operator'&'没有为字符串定义 “上下文:”并输入“HttpContext”。在 Microsoft.VisualBasic.CompilerServices.Operators.InvokeObjectUserDefinedOperator(UserDefinedOperator Op,Object [] Arguments)at Microsoft.VisualBasic.CompilerServices.Operators.InvokeUserDefinedOperator(UserDefinedOperator Op,Object [] Arguments)at Microsoft.VisualBasic.CompilerServices.Operators.ConcatenateObject(对象 左,对象右)
@granadaCoder,你提到我需要知道“深入”的方式,我想知道这是不是问题。在上面的错误中,Context
是一个复杂的对象,所以我需要深入研究并得到它的各个属性,对吗?你知道我怎么能这样做 - 或者它就像在我的循环中GetProperties
再次呼叫p
一样简单吗?
答案 0 :(得分:2)
听起来像反射的一个很好的用例 -
How to iterate through each property of a custom vb.net object?
您可以迭代所有对象的属性并创建自己的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;
}
答案 1 :(得分: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
}
}
当然,当属性是一个复杂的对象(不是标量)时,你必须弄清楚你想要挖掘的“深度”。