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