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