Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种简单的方法可以将所有对象属性作为字符串获取?_C#_Unit Testing - Fatal编程技术网

C# 是否有一种简单的方法可以将所有对象属性作为字符串获取?

C# 是否有一种简单的方法可以将所有对象属性作为字符串获取?,c#,unit-testing,C#,Unit Testing,我有一个名为ReportToDownload的类,它包含几个属性。在测试的断言部分,我将使用我编写的相等比较器比较ReportToDownload的预期列表和实际列表。对于任何不匹配的项目,我希望打印出预期和实际项目的内容,作为消息的一部分,使用: actual[i].ToString() 但这只是返回对象的名称-ReportToDownload。有没有任何方法可以轻松地将对象的全部内容作为字符串获取 根据向谁展示,一个简单的“不费吹灰之力”解决方案是使用JSON: Install-Packa

我有一个名为ReportToDownload的类,它包含几个属性。在测试的断言部分,我将使用我编写的相等比较器比较ReportToDownload的预期列表和实际列表。对于任何不匹配的项目,我希望打印出预期和实际项目的内容,作为消息的一部分,使用:

actual[i].ToString()

但这只是返回对象的名称-ReportToDownload。有没有任何方法可以轻松地将对象的全部内容作为字符串获取

根据向谁展示,一个简单的“不费吹灰之力”解决方案是使用JSON:

Install-Package Newtonsoft.Json
然后

JsonConvert.SerializeObject(actual[i])

与其使用相等比较,不如编写一个方法,使用单元测试的框架内置断言方法比较每个单独的属性,例如:

public void AssertEquals(ReportToDownload actual, ReportToDownload expected)
{
    Assert.That(actual.PropertyA, Is.EqualTo(expected.PropertyA));
    Assert.That(actual.PropertyB, Is.EqualTo(expected.PropertyB));
}
当比较失败时,内置断言方法将适当地打印预期值和实际值


最有可能的是,您的单元测试框架还允许您编写自己的断言,在必要时以自定义方式打印差异。

我不知道这有多有用,但我的看法是:

public class ClassA
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }

    public override string ToString()
    {
        string ret = string.Empty;

        foreach (PropertyInfo pi in this.GetType().GetProperties())
        {
            ret += string.Format("{0}: {1}\r\n", pi.Name, pi.GetValue(this, null).ToString());
        }

        return ret;
    }
}
这样使用:

ClassA a = new ClassA();
a.Prop1 = "Hello";
a.Prop2 = "World";

var toStringOutput = a.ToString();

您可能需要处理更复杂的属性类型,但对于基本属性类型,这应该可以使用。

您可以
重写类中的
ToString()
方法。然后您就可以完全控制属性的显示方式等。