0

テストの目的で、オブジェクトのすべてのプロパティとそれに対応する値を確認したいと思い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:文字列 "Context:"およびタイプ'HttpContext'に対して演算子'&'が定義されていません。Microsoft.VisualBasic.CompilerServices.Operators.InvokeUserDefinedOperator(UserDefinedOperator Op、Object [] Arguments)at Microsoft.VisualBasic.CompilerServices.Operators.InvokeUserDefinedOperator(UserDefinedOperator Op、Object [] Arguments)at Microsoft.VisualBasic.CompilerServices.Operators左、オブジェクト右)

@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 に答える