是否可以使用反射来比较具有相同元素类型的两个数组?

问题描述 投票:0回答:1

我的班级看起来像这样:

public class Test
{
    public A[] ArrayA { get;set; }
}

public class A
{
    public string P1 { get;set; }
    public int P2 { get;set; }
}

假设我有两个 Test 类的对象。我想使用反射来比较两者,假设两个对象中两个 ArrayA 属性的数组长度相同。 例如:

Test a = new Test();
Test b = new Test();

// fill them with some info.

var props = typeof(Test).GetProperties();

foreach (var prop in props)
{
    var arrayA = prop.GetValue(a);
    var arrayB = prop.GetValue(b);

    for (int i = 0; i < arrayA.Lenght; i++)
    {
        var item1 = arrayA.GetValue(i);
        var item2 = arrayB.GetValue(i);
    
        // Do Comparison of item1 and item2
    }
}

这就是我遇到问题的地方。 item1 和 item2 都是对象类型。我似乎无法从中获取原始类型。我可以从数组中获取 Type,如何使用它来获取 item1 和 item2 中我想要的属性?我想使用反射来抓取item1和item2的属性信息,以便进行比较。这可行吗?

仅供参考。除了使用反射之外,我对任何其他解决方案都不感兴趣。我已经知道如何做到这些了。

c# reflection system.reflection
1个回答
0
投票

如果必须使用反射 - 那么您可以通过它仅提取属性将返回的数组。

然后有一个只适用于

A[]
:

的相等方法
void Main()
{
    Test a = new Test();
    Test b = new Test();

    var props = typeof(Test).GetProperties();
    var arrProperty = props
        .Where(x => x.PropertyType == typeof(A[]))
        .FirstOrDefault();
        
    var arrayA = arrProperty.GetValue(a) as A[];
    var arrayB = arrProperty.GetValue(b) as A[];
    
    var arraysEqual = Equal(arrayA,arrayB);
}

public bool Equal(A[] first, A[] second)
{
    // logic irrespective of reflection
    // SequenceEquals e.g. 
    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.