【发布时间】:2020-04-09 19:12:59
【问题描述】:
我想为我的程序创建一个小测试工具,它填充随机对象的所有属性(编译时未知类型)。示例结构:
public class HeadObject
{
public Company Company { get; set; }
public CompanyAddress CompanyAddress { get; set; }
public List<Details> Details{ get; set; }
public ApplicationUser AppUser { get; set; }
}
例如,Company 类看起来像这样:
public class Company
{
public string CompanyName{ get; set; }
public string PhoneNumber{ get; set; }
public Address Adress{ get; set; }
public int CompanyNo{ get; set; }
public List<Employee> Employees{ get; set; }
}
它非常简化,因为在每个 HeadOjbect 中大约有 30 个属性,这些属性可能包含子属性,或者一个属性可以是列表等。我需要在运行时填充大约 30 个 HeadObject。我已经尝试过使用不同的库,例如 GenFu、nBuilder 或 Bogus。
最后2个问题是我必须自己填写属性才生成数据。 GenFu 看起来只能处理 int、string 等原始属性...如果您将 HeadObject 想象为树的根,那么就会有
~ 每棵树 300 个节点
一棵树的高度:在 1 到 7 之间(!)
~30 种不同的树(HeadObjects)
所以我需要几天的时间才能把这些都写下来,而且维护起来会很痛苦。
我很欣赏任何想法。
更新
感谢您的回复!如何初始化对象?例如,我得到了我的头对象的 Company 属性,然后我想初始化它以便能够填充它。我的方法(它的递归)是这样开始的:
private static T FillAllProperties<T>(T masterObject) where T : new()
{
try
{
Type masterType = masterObject.GetType();
T headObject = new T();
......IF primitive Type fill it and return the value
otherwise get Properties into firstProperties.......
foreach (var propertyInfo in firstProperties)
{
var objectInstance = FillAllProperties(propertyInfo.PropertyType);
headObject.GetType().GetProperty($"{propertyInfo.Name}").SetValue(headObject, objectInstance, null);
}
现在我有两个问题:
- 我初始化泛型类型的方法正确吗?
- 在递归调用中,我收到以下错误:“类型 'System.Type' 必须具有公共无参数构造函数才能将其用作参数 'T'....
我可能需要对这个算法进行另一个“构造”,但是如何......?
【问题讨论】:
-
那么到底是什么问题呢?如何使用反射来填充属性?如何为
CompanyName之类的东西生成随机字符串?除了查看一些不符合您要求的库之外,您还尝试过什么? -
您对生成的数据有要求吗?如果没有,您可以通过反射递归遍历所有属性,直到达到简单类型(
int、string等)。然后使用Random填满它们。 -
“如何使用反射来填充属性”我不知道 C# 中的这种可能性。因此,我可以收集对象的所有属性并进行迭代,直到达到简单类型。那么 PropertyInfo.SetValue() 是正确的选择吗?感谢您的回复