3

我上课基本上只是一排桌子。此行包含许多列。

出于测试目的,我需要输出我得到的读数。

所以我需要输出行中的所有列。

上课就像

    public class tableRow
    {
        public tableRow()
        {}
    public string id
    public string name
    public string reg
    public string data1
    ....
    ....
    ....
   <lot more columns>

}  

然后我需要这样写:

Console.WriteLine("id: " + tableRow.id);
Console.WriteLine("name: " + tableRow.name);
Console.WriteLine("reg: " + tableRow.reg);
Console.WriteLine("data1: " + tableRow.data1);
...
...
...
<lot more Console.WriteLine>

所以我想知道,有没有一种简单的方法来获得所有这些输出,而不需要这么多的 console.writeLine?

谢谢

4

5 回答 5

7

您可以将 tableRow 序列化为 JSON,并且将打印所有列。例如,使用JSON.NET(可从 NuGet 获得):

tableRow tr = new tableRow { id = "42", name = "Bob", reg = "Foo" };
Console.WriteLine(JsonConvert.SerializeObject(tr, Formatting.Indented));

输出:

{
  "id": "42",
  "name": "Bob",
  "reg": "Foo",
  "data1": null
}

我使用这种方法进行日志记录(以显示对象状态) - 很高兴有扩展

public static string ToJson<T>(this T obj)
{ 
    return JsonConvert.SerializeObject(tr, Formatting.Indented);
}

用法很简单:

Console.WriteLine(tr.ToJson());
于 2013-11-06T22:05:17.683 回答
2

这应该适用于类以及具有自定义类型描述符的类型:

private static void Dump(object o)
{
    if (o == null)
    {
        Console.WriteLine("<null>");
        return;
    }

    var type = o.GetType();
    var properties = TypeDescriptor.GetProperties(type);

    Console.Write('{');
    Console.Write(type.Name);

    if (properties.Count != 0)
    {
        Console.Write(' ');

        for (int i = 0, n = properties.Count; i < n; i++)
        {
            if (i != 0)
                Console.Write("; ");

            var property = properties[i];

            Console.Write(property.Name);
            Console.Write(" = ");
            Console.Write(property.GetValue(o));
        }
    }

    Console.WriteLine('}');
}

如果要转储字段而不是属性,可以使用type.GetFields()上述代码并进行必要的修改。 FieldInfo有类似的GetValue()方法。

请注意,这不会打印记录的“深度”表示。为此,您可以将其调整为递归解决方案。您可能还希望支持集合/数组、引用字符串和标识循环引用。

于 2013-11-06T22:10:31.857 回答
2

这是一个使用反射的简短示例:

void Main()
{
    var myObj = new SomeClass();
    PrintProperties(myObj);

    myObj.test = "haha";
    PrintProperties(myObj);
}

private void PrintProperties(SomeClass myObj){
    foreach(var prop in myObj.GetType().GetProperties()){
     Console.WriteLine (prop.Name + ": " + prop.GetValue(myObj, null));
    }

    foreach(var field in myObj.GetType().GetFields()){
     Console.WriteLine (field.Name + ": " + field.GetValue(myObj));
    }
}

public class SomeClass {
 public string test {get; set; }
 public string test2 {get; set; }
 public int test3 {get;set;}
 public int test4;
}

输出:

test: 
test2: 
test3: 0
test4: 0

test: haha
test2: 
test3: 0
test4: 0
于 2013-11-06T22:11:20.100 回答
0

你可以使用反射来做到这一点......给我一分钟,我会发布一些代码

伴随着一些东西:

PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public |
                                              BindingFlags.Static);
// sort properties by name
Array.Sort(propertyInfos,
        delegate(PropertyInfo propertyInfo1, PropertyInfo propertyInfo2)
        { return propertyInfo1.Name.CompareTo(propertyInfo2.Name); });

// write property names
foreach (PropertyInfo propertyInfo in propertyInfos)
{
  Console.WriteLine(propertyInfo.Name);
}

您可以添加一个检查以查看它是一个字符串,并添加一些输出,但这就是它的 git。

来自这里的来源

于 2013-11-06T22:04:38.197 回答
0

如果你设置了一个字符串数组

var dataFields = new string[] { "id", "name", ...

您可以执行一个 foreach 循环来填充表格,并使用相同的数组引用表格数据,从而允许您执行另一个 foreach 循环来执行 Console.WriteLine 调用

如果您愿意,每个表行可以只是一个字典,数据字段作为键,数据作为值。然后你可以遍历字典

于 2013-11-06T22:05:09.883 回答