2

我有一个名为 Job 的对象,在其中我有字符串、整数和枚举作为公共对象。然后将每个作业放入一个队列中,并在此过程中遍历队列。

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

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

我看过 C# object dumper C#: How to get all public (get and set) string properties of a type How to select all values of an object's property on a list of typed objects in .Net with C# but don't不明白我将如何在那里使用任何一个接受的答案。

这是我的 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());
}

这些将转储到控制台,但应该足够直截了当,可以将它们更改为写入任何流。

更新

如果您开始NullReferenceException从未设置的属性中获取 's,而不是将其包装在 a 中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 回答