C# Lambda用于查找反射在C中未正确返回的属性差异#

C# Lambda用于查找反射在C中未正确返回的属性差异#,c#,.net,reflection,lambda,C#,.net,Reflection,Lambda,我正试图解决一个基于其他几个帖子的问题。我正在查看列表中具有相同属性的多个对象,我需要验证它们在每个对象中的值是否相同。如果没有,我需要标记对象具有冲突的属性值。下面是我正在尝试的代码,虽然它可以工作,但它总是返回true以将属性添加到列表中,即使列表项中的值都相同 public List<string> JobHasConflictingTaxForms(Job job, List<string> propertiesToCheck) { var conflic

我正试图解决一个基于其他几个帖子的问题。我正在查看列表中具有相同属性的多个对象,我需要验证它们在每个对象中的值是否相同。如果没有,我需要标记对象具有冲突的属性值。下面是我正在尝试的代码,虽然它可以工作,但它总是返回true以将属性添加到列表中,即使列表项中的值都相同

public List<string> JobHasConflictingTaxForms(Job job, List<string> propertiesToCheck)
{
    var conflictingPropertiesList = new List<string>();

    foreach(string prop in propertiesToCheck)
    {
         if (!job.TaxForms.TrueForAll(t => t.ARecord.GetType().GetProperty(prop)
                          .GetValue(t.ARecord, null) ==
                           job.TaxForms[0].ARecord.GetType().GetProperty(prop)
                          .GetValue(job.TaxForms[0].ARecord, null)))
         {
             conflictingPropertiesList.Add(prop);
         }
    }

    return conflictingPropertiesList;
}
公共列表作业有冲突的TaxForms(作业作业,列表属性检查)
{
var conflictingPropertiesList=新列表();
foreach(propertiesToCheck中的字符串属性)
{
if(!job.TaxForms.TrueForAll(t=>t.ARecord.GetType().GetProperty(prop)
.GetValue(t.ARecord,null)==
job.TaxForms[0].ARecord.GetType().GetProperty(prop)
.GetValue(job.TaxForms[0].ARecord,null)))
{
冲突属性列表。添加(属性);
}
}
返回冲突属性列表;
}
每个纳税申报单都有一个对象作为一个名为“ARecord”的属性。这些是我需要验证的属性,它们对于每个纳税申报表都是相同的,如果不是,那么我需要标记其中一个是否存在差异。我遗漏了什么,或者这个lambda声明做错了什么?即使我有所有相同的值,或者三个具有相同值的表单,以及一个具有不同属性的表单,它也会返回相同的结果。它总是返回真的

另外,我也尝试过使用任何(I=>logic!=其他项)。但这不是我想要的

类群

 public class TaxForm 
{
    #region Properties

    public string TaxFormType
    {
        get;
        set;
    }

    public string FileName
    {
        get;
        set;
    }

    public string FileFullName
    {
        get;
        set;
    }

    public bool ShouldProcess
    {
        get;
        set;
    }

    public bool Corrected
    {
        get;
        set;
    }

    public TRecord TRecord
    {
        get;
        set;
    }

    public ARecord ARecord
    {
        get;
        set;
    }

    public BRecord BRecord
    {
        get;
        set;
    }

    public List<string> BRecords
    {
        get;
        set;
    }

    public bool HasConflictingrecords
    {
        get;
        set;
    }

    public bool HasDataConflict
    {
        get;
        set;
    }

    #endregion
公共类分类表
{
#区域属性
公共字符串TaxFormType
{
得到;
设置
}
公共字符串文件名
{
得到;
设置
}
公共字符串文件名
{
得到;
设置
}
公共布尔过程
{
得到;
设置
}
公共图书馆
{
得到;
设置
}
公共脐带
{
得到;
设置
}
公共记录
{
得到;
设置
}
公共布雷科德布雷科德酒店
{
得到;
设置
}
公开名单
{
得到;
设置
}
公共图书馆有冲突的记录
{
得到;
设置
}
公共布尔值冲突
{
得到;
设置
}
#端区
}

现在是ARecord课程

public class ARecord
{
    #region Properties
    /// <summary>
    /// Found at POS(12) for 8
    /// </summary>
    public string PayerTIN
    {
        get;
        set;
    }

    /// <summary>
    /// Found at POS(38) for 39.
    /// </summary>
    public string PayerName
    {
        get;
        set;
    }

    /// <summary>
    /// Found at POS(134) for 39.
    /// </summary>
    public string PayerAddress
    {
        get;
        set;
    }

    /// <summary>
    /// found at POS(255) for 14.
    /// </summary>
    public string PayerPhone
    {
        get;
        set;
    }

    /// <summary>
    /// Found at POS(2) for 3.
    /// </summary>
    public string PayerYear
    {
        get;
        set;
    }

    #endregion


}
公共类记录
{
#区域属性
/// 
///在8号位置(12)处找到
/// 
公共字符串付款人
{
得到;
设置
}
/// 
///在39的位置(38)处找到。
/// 
公共字符串付款人名称
{
得到;
设置
}
/// 
///在39的位置(134)处找到。
/// 
公共长裙
{
得到;
设置
}
/// 
///在位置(255)处找到14。
/// 
公用电话
{
得到;
设置
}
/// 
///在3的位置(2)处找到。
/// 
公共字符串付款人耳
{
得到;
设置
}
#端区
}

PropertyInfo.GetValue方法返回它作为类型
对象引用的属性值。执行的==运算符是针对
对象
类的运算符,而不是针对
字符串
的运算符


要执行正确的比较方法,您需要将调用
PropertyInfo.GetValue
的返回值强制转换为
string
,然后使用==运算符或调用静态
string.Equals
方法。

@Tony的建议是,它们由一个对象实例进行比较,而不是实际的字符串值。下面的代码纠正了这个问题,并给出了正确的结果

foreach(string prop in propertiesToCheck)
        {
             if(!job.TaxForms.TrueForAll(t => t.ARecord.GetType().GetProperty(prop).GetValue(t.ARecord, null).ToString().Equals(job.TaxForms[0].ARecord.GetType().GetProperty(prop).GetValue(job.TaxForms[0].ARecord, null).ToString())))
             {
                 conflictingPropertiesList.Add(prop);
             }
        }

所以这应该更好?

什么是属性类型?它们本身是一个集合吗?不是。唯一的集合是分类表。然后记录一个对象属性。然后是所有字符串类型的常规属性。因此,ARecord不是一个集合,也没有任何集合。我可以发布这两个类的一个快速示例。我希望它能解释清楚,并在代码中显示我在这里要完成的内容。如果不是的话,我可以再解释一下。希望使用反射方法以较少的代码处理此问题。如果所有属性都是字符串,请尝试使用静态
string.Equals
方法,而不是==运算符。在这种情况下,==运算符可能正在执行引用比较,而不是值比较。不要说它是,但试着用另一种方法看看它是否有区别。在查找
PropertyInfo.GetValue
方法时,它返回一个
对象
。对象的==运算符执行引用比较。您需要强制转换到
字符串,并进行字符串相等性比较。@Casey我建议您在线搜索一个库来执行您正在尝试执行的操作。您为实现此方法选择的路线非常缓慢。互联网上应该有很多例子,展示了如何通过使用运行时编译的缓存的
Func
来做同样的事情,这会更有效。您可以选择使用纯IL或表达式树编写。只要有
null
值,此代码就会中断。这是正确的。不过,我会检查null条目,并且不会将属性保留为null。您不能只使用Convert.ToString(null作为对象)获取一个返回的“”值来处理它吗?如果有人想用类似的东西,你应该用
string.Equals来比较字符串。清晰、直接、有效。