将容器对象中的所有公共对象(string/int/enum)的值写入Console
本文关键字:int enum Console string 对象 公共对象 | 更新日期: 2023-09-27 18:19:24
我有一个名为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 );