如何使用反射标识列表字段并将新对象添加到该列表?

本鲁宾

我有两个对象,这些对象的大多数属性具有相同的类型和名称,并且我有一个方法将对象A的值分配给对象B中的匹配属性。我正在编写一个单元测试,该调用应调用该方法,然后进行断言对于对象B中具有匹配属性的对象A中的每个属性,将复制该值。

我要完成此操作的想法是使用反射枚举对象A中的所有属性,然后为每个属性分配一个随机值。然后,我调用“复制值”方法以将值复制到对象B,然后使用反射来枚举每个对象上的字段,并确保具有匹配名称的字段具有相同的值。

这是我为对象A分配随机值的代码

var objectA = new ObjectA();
var random = new Random();
var fields = typeof(ObjectA).GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var field in fields)
{
    if (field.CanWrite)
    {
        if (field.PropertyType == typeof(bool) || field.PropertyType == typeof(bool?))
        {
            field.SetValue(objectA, Convert.ToBoolean(random.Next(2)));
        }
        if (field.PropertyType == typeof(decimal) || field.PropertyType == typeof(decimal?))
        {
            field.SetValue(objectA, Convert.ToDecimal(random.Next()));
        }
        if (field.PropertyType == typeof(string))
        {
            field.SetValue(objectA, random.Next().ToString());
        }
        // similar code for other data types
    }
}

然后,我调用我的方法来复制值:

ObjectB objectB = ObjectB.FromObjectA(objectA);

然后,我调用此方法来比较两个对象的值:

public static void AssertMatchingFieldAreEqual<T1, T2>(T1 a, T2 b)
{
    foreach (var fieldA in typeof(T1).GetProperties(BindingFlags.Instance | BindingFlags.Public))
    {
        var fieldInfoB = typeof(T2).GetProperty(fieldA.Name);
        if (fieldInfoB != null)
        {
            var propertyA = typeof(T1).GetProperty(fieldA.Name);
            var propertyB = typeof(T2).GetProperty(fieldA.Name);

            // Adding field names to make error messages for failed Assert calls list the field name
            var valueA = $"{propertyA.Name}: {propertyA.GetValue(a)}";
            var valueB = $"{propertyB.Name}: {propertyB.GetValue(b)}";

            Assert.AreEqual(valueA, valueB);
        }
    }
}

这适用于基本数据类型。我的问题是我有一些是Lists的字段,我想用它们的类型的随机数量的对象填充它们,然后断言在复制字段时,每个列表都具有相同数量的对象。

我的两个问题:

  1. 分配值时,如何在List不知道列表中项目类型的情况下检查属性是否为我已经尝试过了if (field.PropertyType == typeof(List<object>),但这不起作用。

  2. T当我的属性类型是列表时,如何创建类型为add并将其添加到列表的新对象

或者,如果有更好的方法来检查我的“复制值”方法是否复制了所有相同名称的字段,还有什么更好的方法?

脱衣战士

您问题的直接答案是,您需要将通用测试纳入您的反思中。

    if(field.PropertyType.GetGenericTypeDefinition() == typeof(List<>)){
        var typeOfThingInside = field.PropertyType.GetGenericArguments()[0];
        // ...
    }

更好的方法是使用AutoFixture创建对象,然后使用Fluent断言检查是否已复制所有内容。

void Main()
{
    // Arrange
    var fixture = new Fixture();
    var a = fixture.Create<ObjectA>();
    
    // Act
    var b = ObjectB.FromObjectA(a);
    
    // Assert
    b.Should().BeEquivalentTo(a, options => options.ExcludingMissingMembers());
}

public class ObjectA {
    public int A {get;set;}
    public string B {get;set;}
    public List<string> C {get;set;}
    public decimal Z {get;set;}
}
public class ObjectB
{
    public int A { get; set; }
    public string B { get; set; }
    public List<string> C { get; set; }
    public decimal Y { get; set; }
    
    public static ObjectB FromObjectA(ObjectA a) => JsonConvert.DeserializeObject<ObjectB>(JsonConvert.SerializeObject(a));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用反射将对象添加到类的实例的泛型列表属性中

来自分类Dev

Python遍历列表并将总和添加到新列表

来自分类Dev

Java反射-构造对象并添加到列表

来自分类Dev

按键创建一个新对象并将其添加到列表中

来自分类Dev

如何添加到 C# 反射中的列表?

来自分类Dev

如何使用 setState 将对象添加到数组列表

来自分类Dev

OOP解析并将对象添加到列表

来自分类Dev

动态创建对象并将其添加到列表JavaFX

来自分类Dev

Mailchimp-将复选框添加到列表字段

来自分类Dev

将类别添加到果园cms的选择列表字段中的单选按钮

来自分类Dev

如何删除新列列表并将其添加到.csv文件?

来自分类Dev

如何在C#中迭代JSON并将每个对象添加到列表中?

来自分类Dev

无法添加对象并将列表一起添加到对象列表中

来自分类常见问题

将对象字段添加到列表的最佳方法

来自分类Dev

无法将新值添加到列表对象

来自分类Dev

将新对象添加到列表不起作用

来自分类Dev

如何遍历由多个对象组成的列表并将它们的属性添加到单独的列表中?

来自分类Dev

将项目添加到列表字典

来自分类Dev

将元素添加到列表字典

来自分类Dev

将项目添加到列表字典

来自分类Dev

将项目添加到列表字典

来自分类Dev

LocalStorage并将li添加到列表

来自分类Dev

如何使用python选择特定的列表元素并将其添加到csv行中

来自分类Dev

如何将新对象添加到不带变量的列表中?

来自分类Dev

添加到列表中时如何生成新的对象名称

来自分类Dev

如何将新对象添加到不带变量的列表中?

来自分类Dev

如何将新对象添加到已创建的列表中?

来自分类Dev

将新对象添加到列表中,而无需使用Django&Ajax刷新

来自分类Dev

排序列表并将排序后的值添加到bash中的新列表中

Related 相关文章

  1. 1

    如何使用反射将对象添加到类的实例的泛型列表属性中

  2. 2

    Python遍历列表并将总和添加到新列表

  3. 3

    Java反射-构造对象并添加到列表

  4. 4

    按键创建一个新对象并将其添加到列表中

  5. 5

    如何添加到 C# 反射中的列表?

  6. 6

    如何使用 setState 将对象添加到数组列表

  7. 7

    OOP解析并将对象添加到列表

  8. 8

    动态创建对象并将其添加到列表JavaFX

  9. 9

    Mailchimp-将复选框添加到列表字段

  10. 10

    将类别添加到果园cms的选择列表字段中的单选按钮

  11. 11

    如何删除新列列表并将其添加到.csv文件?

  12. 12

    如何在C#中迭代JSON并将每个对象添加到列表中?

  13. 13

    无法添加对象并将列表一起添加到对象列表中

  14. 14

    将对象字段添加到列表的最佳方法

  15. 15

    无法将新值添加到列表对象

  16. 16

    将新对象添加到列表不起作用

  17. 17

    如何遍历由多个对象组成的列表并将它们的属性添加到单独的列表中?

  18. 18

    将项目添加到列表字典

  19. 19

    将元素添加到列表字典

  20. 20

    将项目添加到列表字典

  21. 21

    将项目添加到列表字典

  22. 22

    LocalStorage并将li添加到列表

  23. 23

    如何使用python选择特定的列表元素并将其添加到csv行中

  24. 24

    如何将新对象添加到不带变量的列表中?

  25. 25

    添加到列表中时如何生成新的对象名称

  26. 26

    如何将新对象添加到不带变量的列表中?

  27. 27

    如何将新对象添加到已创建的列表中?

  28. 28

    将新对象添加到列表中,而无需使用Django&Ajax刷新

  29. 29

    排序列表并将排序后的值添加到bash中的新列表中

热门标签

归档