使用反射模仿VB.Net中的Debug.Print

时间:2012-01-23 15:14:59

标签: vb.net smo

跟进Direct access to full string representation of object

我正在尝试将对象的内容记录到文本文件中。我可以通过在即时窗口中执行此行来获取我想要记录的属性 - 值对:

?mDb.DatabaseOptions
{Microsoft.SqlServer.Management.Smo.DatabaseOptions}
    AnsiNullDefault: False
    ...
    UserData: Nothing

不幸的是,我不能简单地记录mDb.DatabaseOptions.ToString,因为它不会返回任何属性 - 值对。

我尝试使用反射来滚动自己的代码。它有效,但它返回的信息比我需要的更多。 debug.print返回33个属性 - 值对,但以下代码返回95个属性 - 值对。

For i As Integer = 0 To mDb.DatabaseOptions.Properties.Count - 1
    WriteLine(mDb.DatabaseOptions.Properties(i).Name & ": " & _
              mDb.DatabaseOptions.Properties(i).Value.ToString)
Next

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您没有使用反射,只是对象的属性“属性”。这与Debug.Print更接近,我相信:

Public Sub WriteAsDebug(ByVal obj As Object)
    For Each prop In obj.GetType.GetProperties()
        WriteLine("{0}: {1}", prop.Name, prop.GetValue(obj, Nothing).ToString)
    Next
End Sub

此方法获取(通过反射)对象类型中定义的所有公共属性,并在特定对象实例中写入属性的名称和值(To String)。免责声明,我很确定这种方法在尝试访问索引属性(带参数的属性)时会失败。

我不确定Debug.Print是否也只报告公共成员,如果需要更多成员,请检查GetProperties方法的BindingFlags选项。您还可以获得有关该方法返回的PropertyInfo类型的更多信息。

但是,您使用的Properties属性可能会提供不包含在类属性中的数据(这是Debug.Print提供的)。