2009-02-06 56 views
4

我们有一个场景,其中如果实例存在于源和目标之间,我们应该合并目标中的数据,即从目标列为空的基础列复制值。查找对象中的空白字段 - C#

我们正在使用WCF服务调用,并且我们有实体对象。

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

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

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

回答

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); 
} 
5

您可以通过反射获取所有属性,然后在每个PropertyInfo实例上调用GetValue。凡为空,你将返回的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; 
} 

你要知道,这将在类型,而不是非公共属性仅返回公共属性。

+0

另外,我不相信这会告诉你,如果一个字符串是空的。但是,这可以很容易地修改来做到这一点。 – BobbyShaftoe 2009-02-06 22:30:55

+0

美丽,我爱酷LINQ +1 – bendewey 2009-02-06 22:32:48

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;