在对象中查找空白字段 - C#

时间:2009-02-06 22:23:24

标签: c#

我们有一个场景,如果在源和目标之间存在实体,我们应该合并目标中的数据,即从目标列为空的基础列复制值。

我们正在使用WCF servcie调用,我们有实体对象。

如果我有一个实体,我们可以说Staff,工作人员会同意基本的名称等属性,我们会列出StaffAddressStaffEmailStaffPhone的列表。

所以我只是想知道有没有使用LINQ或任何其他机制的方法 - 我可以找到Staff对象上的属性列表为空或空白?

一个基本的方法当然是手动检查一个属性是空白的吗?

3 个答案:

答案 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;