2

Jobというオブジェクトがあり、その中に文字列、int、列挙型がパブリックオブジェクトとしてあります。次に、各ジョブがキューに配置され、プロセスでキューを反復処理します。

私がやりたいのは、各ジョブをDequeue()するときに、一般的に各ジョブを反復処理して、パブリックオブジェクトの名前と値をコンソールに書き込むことができるということです。

オブジェクト名をコンソールに書き込む方法を理解し、明らかに値を書き込むことができますが、問題は、Jobオブジェクトから各パブリック文字列/整数/列挙型を取得する方法がわからないことです。

C#オブジェクトダンパー を見てきました C#:型のすべてのパブリック(取得と設定の両方)文字列プロパティを取得する 方法C#を使用して .Netの型付きオブジェクトのリストでオブジェクトのプロパティのすべての値を選択する方法そこで受け入れられた回答のいずれかをどのように使用するかを理解します。

これが私のJobクラスのコードです:

    class Job
    {
       #region Constructor
       public Job()
       {
       }
       #endregion

       #region Accessors
       public int var_job { get; set; }
       public jobType var_jobtype { get; set; } //this is an enum
       public string var_jobname { get; set; }
       public string var_content { get; set; }
       public string var_contenticon { get; set; }
       #endregion
    }

変数の名前を返すコードは次のとおりです:(https://stackoverflow.com/a/2664690/559988から)

GetName(new {Job.var_content}) //how I call it
static string GetName<T>(T item) where T : class
{
    return typeof(T).GetProperties()[0].Name;
}

理想的には、次のようなコンソールへの出力があります。

Queuing Jobs Now
--------------------
var_job = its value
var_jobtype = its value
var_jobname = its value
var_content = its value
var_contenticon = its value

考え?

4

2 に答える 2

3

あなたが探しているのはですPropertyInfo.GetValue。おそらく、このようなものが役立つでしょう(メモリから、うまくいけば、そのまま動作します):

public static void DumpProperties(this Object dumpWhat)
{
    foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties())
        Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null).ToString());
}

プロパティの代わりにそれらを使用する傾向がある場合は、オブジェクトのフィールドと同様のものを使用することもできます。

public static void DumpFields(this Object dumpWhat)
{
    foreach(FieldInfo fld in dumpWhat.GetType().GetFields())
        Console.WriteLine("{0} = {1}", fld.Name, fld.GetValue(dumpWhat, BindingFlags.GetField, null, null, null).ToString());
}

これらはコンソールにダンプされますが、任意のストリームに書き込むように変更するのに十分簡単である必要があります。

アップデート

設定されていないプロパティから'sを取得し始める場合NullReferenceExceptionは、プロパティをでラップするのではなく、:try...catchから返された値に対してプロアクティブなチェックを行う必要があります。PropertyInfo.GetValue

public static void DumpProperties(this Object dumpWhat)
{
    foreach(PropertyInfo prop in dumpWhat.GetType().GetProperties())
    {
        string propVal = prop.GetValue(dumpWhat, BindingFlags.GetProperty, null, null, null) as string;

        if (propVal != null)
            Console.WriteLine("{0} = {1}", prop.Name, propVal);
    }
}
于 2012-01-03T18:50:47.663 に答える
1

Tony Hopkinsonの提案に従って、次のメソッドオーバーライドをJobクラスに追加できます。

    public override string ToString()
    {
        string foo =
            string.Format( "var_job = {1}{0}var_jobType = {2}{0}var_jobname = {3}{0}var_content = {4}{0}var_contenticon = {5}{0}",
                Environment.NewLine,
                this.var_jobname,
                this.jobType,
                this.var_jobname,
                this.var_content,
                this.var_contenticon );

        return foo;
    }

次に、キューに入れる前に、次のことを行います。

    Console.WriteLine( job1 );
于 2012-01-03T18:42:41.633 に答える