2009-02-06 2 views
4

원본과 대상 사이에 엔티티가있는 경우 대상의 데이터를 병합 즉 대상 열이 비어있는 기초 열의 값을 복사하는 시나리오가 있습니다.개체의 빈 필드 찾기 - C#

우리는 WCF servcie 호출을 사용하고 있으며 엔티티 객체가 있습니다. 내가있는 경우

는 기업이 직원 이름 등의 기본 속성을 conatins 우리가 StaffAddress, StaffEmailStaffPhone에 대한 목록을 가지고, Staff 말할 수 있습니다.

LINQ 또는 다른 메커니즘을 사용하는 방법이 있는지 알고 싶습니다. null 또는 공백 인 Staff 개체에서 속성 목록을 찾을 수 있습니까?

하나의 기본 방법은 하나의 속성을 비어있는 것으로 수동으로 확인하는 것입니다.

답변

1

여기

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를 호출 할 수 있습니다. 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; 
} 

마음 당신은이 유형, 비하지 공용 속성에만 공용 속성을 반환합니다.

+0

또한 LINQ와 함께 할 수있는 신속하고 더러운 방법 나는이 경우 당신에게 말할 것이다 믿지 않는,의를 문자열이 비어 있습니다. 그러나 이것을 쉽게 수정할 수 있습니다. – BobbyShaftoe

+0

Beautiful, 멋진 LINQ +1을 좋아합니다. – bendewey

+0

BindingFlags.Instance를 지정할 필요가 없습니다. BindingFlags.Public 여기에 있습니다. 이것이 기본값입니다. –

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; 
+0

불행히도, 이것은 포스터가 원하는 것 같지 않은 정적 속성을 얻을 수 있습니다. – casperOne