我们有一个场景,如果在源和目标之间存在实体,我们应该合并目标中的数据,即从目标列为空的基础列复制值。
我们正在使用WCF servcie调用,我们有实体对象。
如果我有一个实体,我们可以说Staff
,工作人员会同意基本的名称等属性,我们会列出StaffAddress
,StaffEmail
和StaffPhone
的列表。
所以我只是想知道有没有使用LINQ或任何其他机制的方法 - 我可以找到Staff
对象上的属性列表为空或空白?
一个基本的方法当然是手动检查一个属性是空白的吗?
答案 0 :(得分:5)
您可以通过反射获取所有属性,然后在每个PropertyInfo实例上调用GetValue。如果为null,则返回PropertyInfo:
static IEnumerable<PropertyInfo> GetNullProperties(object obj)
{
// Get the properties and return only the ones where GetValue
// does not return null.
return
from pi in obj.GetType().GetProperties(
BindingFlags.Instance | BindingFlags.Public)
where pi.GetValue(obj, null) != null
select pi;
}
请注意,这将只返回类型的公共属性,而不是非公共属性。
答案 1 :(得分:1)
使用LINQ
这是一种快速而又脏的方法public static IEnumerable<string> FindBlankFields(Staff staff)
{
return staff.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public |
BindingFlags.NonPublic)
.Where(p => p.CanRead)
.Select(p => new { Property = p, Value = p.GetValue(staff, null) })
.Where(a => a.Value == null || String.IsNullOrEmpty(a.Value.ToString()))
.Select(a => a.Property.Name);
}
答案 2 :(得分:0)
你需要对此进行一些反思:
var unsetProperties = from prop in foo.GetType().GetProperties()
let value = prop.GetValue(foo, null)
where value == null || value.Equals(string.Empty)
select prop.Name;