0

은 .. 안녕, 나는이 같은 실체를 일부 열 값을 연결하기 위해 노력하고있어 :엔티티 프레임 워크 재산권 설명자 수집 필드 값 만

var valor = ""; 

     PropertyDescriptorCollection objProperties = TypeDescriptor.GetProperties(obj); 


     foreach (PropertyDescriptor objProperty in objProperties) 
     { 

      if (objProperty.Name != "AuditoriaUC" && objProperty.Name != "AuditoriaFC" 
       && objProperty.Name != "AuditoriaIPC" && objProperty.Name != "AuditoriaUM" 
       && objProperty.Name != "AuditoriaFM" && objProperty.Name != "AuditoriaIPM" 
       && objProperty.Name != "AuditoriaEliminado") 
      { 
       valor = valor + " " + objProperty.Name + ": " + Convert.ToString(objProperty.GetValue(obj)); 
      } 
     } 

     return valor; 

그러나, 그것은 또한 나에게 열 참조를 보여줍니다. 즉, 그것은 또한 끝에이 인쇄 :

"ArchivosAdjuntos:System.Data.Objects.DataClasses.EntityCollection`1[XXX.MyProject.Model.Entities.ArchivosAdjuntos] 
CorrelativoActualPorPeriodo: XXX.MyProject.Model.Entities.CorrelativoActualPorPeriodo 
CorrelativoActualPorPeriodoReference: System.Data.Objects.DataClasses.EntityReference`1[XXX.MyProject.Model.Entities.CorrelativoActualPorPeriodo] 
EntityState: Modified 
EntityKey: System.Data.EntityKey" 

나는 단지 난 그냥 foreach 문을 깰 수있는 하드 코딩 된 문자열의 마지막 열 값을 비교함으로써 달성 할 수있는 열 값을 반환하고 싶습니다. 그러나 나는 더 좋은 방법이 있는지 정말로 알고 싶다. 그런 다음

PropertyInfo[] props = obj.GetType().GetProperties(BindingFlags.Public 
                | BindingFlags.Instance); 

당신이 제거 할 수 있습니다 참조 유형 properties.For 예를 필터링하는 LINQ를 사용할 수 있습니다

답변

0

먼저 공공의 속성을 반환과 같은 몇 가지 필터링을 할 수 Type 클래스의 GetProperties를 방법을 사용할 수 있습니다 (문자열 제외) 모든 참조 유형 속성과 그들을 반복 :

var valueProps = props.Where(p => !p.PropertyType.IsClass 
           || p.PropertyType == typeof(string)) 
valueProps.ToList().ForEach(p => 
          valor += p.Name + ": " 
           + (p.GetValue(obj) ?? "null")); 

마지막으로, 당신은 하드 코딩 된 목록을 사용하여 제외하는 그 속성에 대한, 당신은 필터링 expressi에 속성 이름의 하드 코딩 된 목록을 추가 할 수 있습니다 위에. 그러나 제외하려는 필드에 속성을 추가하고 해당 속성을 포함하여 속성 목록에서 속성을 제거하는 것도 고려해 볼 수 있습니다.

: 이 당신은 속성을 포함하는 자들을 제외하도록 업데이트 될 값의 유형 속성을 추출하기 위해 다음

public class YourClass 
{ 
    public string PropertyThatIsIncluded { get; set; } 
    public int ThisIsIncludedToo { get; set; } 
    //more value type properties to be included ... 

    [ExcludeThisProperty] 
    public string AuditoriaUC { get; set; } 
    [ExcludeThisProperty] 
    public string AuditoriaFC { get; set; } 
    //more value type properties explicitly excluded ... 

    //reference type properties like this one will be automatically excluded 
    public CorrelativoActualPorPeriodo CorrelativoActualPorPeriodo { get; set; } 
} 

표현처럼 클래스에 설정할 수

[AttributeUsage(AttributeTargets.Property)] 
public class ExcludeThisPropertyAttribute: Attribute 
{ 
} 

속성 것

var valueProps = props.Where(p => 
       p.GetCustomAttributes(typeof(ExcludeThisPropertyAttribute), true) == 0 
       &&(!p.PropertyType.IsClass 
        || p.PropertyType == typeof(string)))  

귀하의 경우에는 엔티티 프레임 워크를 사용하고있는 것 같습니다. 따라서 클래스가 EF에 의해 생성 된 경우 p의 속성을 설정할 수 있도록하려면 당신이 사용하는 접근 방식을 따라야 할 roperties auxiliary metadata class

+0

멋지다, 속성 클래스와 약간의 잔인한지만, 덕분에, 감사합니다 Logged –