将容器对象中的所有公共对象(string/int/enum)的值写入Console



我有一个名为Job的对象,在它的内部我有字符串、整型和枚举作为公共对象。然后将每个作业放入一个Queue中,并在进程中遍历该队列。

我想做的是,当我Dequeue()每个作业时,我可以一般地遍历每个作业并将公共对象的名称和值写入控制台。

我弄清楚了如何将对象名称写入控制台,我显然可以编写值,但问题是我不知道如何从Job对象中获取每个公共字符串/int/enum。

我看过c#对象转储器c#:如何获取一个类型的所有公共(get和set)字符串属性如何选择一个对象's属性的所有值在。net与c#类型化对象的列表但我不明白我该如何使用这两个公认的答案。

下面是我的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
    }

下面是返回变量名的代码:(from 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

想法吗?

我想你要找的是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());
}

这些将转储到控制台,但它应该足够直接地更改它们以写入任何流。

如果您开始从未设置的属性中获得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);
    }
}

根据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 );

最新更新