2009-10-21 2 views
0

개체 인스턴스가 다른 개체 인스턴스의 속성 또는 하위 속성인지 어떻게 알 수 있습니까?속성 드릴 다운은 어떻게합니까?

예를 들어 나는이 클래스 구조가 있습니다

public class Car 
{ 
     public Manufacturer Manufacturer {get;set;} 
} 

public class Manufacturer 
{ 
     public List<Supplier> {get;set;} 
} 

public class Supplier 
{ 
     string SupplierName {get;set;} 
} 

그리고이 두 경우, 자동차와 SupplierName이를; CarInstance의 속성 제조 업체가 SupplierName SupplierNameInstance

답변

2

이렇게하면 원하는 작업을 수행 할 수 있습니까? 미안. 가장 깨끗한 것이 아니라면 거기에 null 체크를 추가하고 싶을 것입니다.

private bool IsPropertyOrSubPropertyOf(Object Owner, Object LookFor) 
{ 

    if (Owner.Equals(LookFor)) 
    { 
     // is it a property if they are the same? 
     // may need a enum rather than bool 
     return true; 
    } 

    PropertyInfo[] Properties = Owner.GetType().GetProperties(); 

    foreach (PropertyInfo pInfo in Properties) 
    { 
     var Value = pInfo.GetValue(Owner, null); 

     if (typeof(IEnumerable).IsAssignableFrom(Value.GetType())) 
     { 
      // Becomes more complicated if it can be a collection of collections 
      foreach (Object O in (IEnumerable)Value) 
      { 
       if (IsPropertyOrSubPropertyOf(O, LookFor)) 
        return true; 
      } 
     } 
     else 
     { 
      if (IsPropertyOrSubPropertyOf(Value, LookFor)) 
      { 
       return true; 
      } 
     } 

    } 
    return false; 
} 

편집 :;

+0

LookFor는 내 경우 IEnumerable이 아닐 것이라고 생각합니다. 그것이 작동한다면 나는이 논리를 시도 할 것이고, 나는 그것을 강력하게 생각한다. – Lance

+0

그것은 효과가 없었기 때문에 결코 끝내지 않는 루프 인 것처럼 보이기 때문에 하위 속성을 얼마나 깊게 파고 드는지 알려주는 깊이 매개 변수를 추가했습니다. 그리고 물론 null 체크와 예외 처리. 매우 감사합니다. – Lance

+0

내 응용 프로그램에 약간의 시차가 있지만 Microsoft의 새로운 작업 병렬 라이브러리 (TPL)를 사용하면 도움이 될 것입니다. – Lance

2
이있는 공급 업체가 있다면이 방법이 true를 돌려줍니다

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance) 

으로 사용하는 방법을 같은

bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance) 

구현할 수있는 방법 반사에 PropertyInfo 사용

당신이 묘사하고있는 특정 예를 위해 리플렉션을 사용할 필요는 없습니다. :

(덧붙여서 Manufacturer 클래스에있는 List<Supplier> 속성의 이름을 놓치 셨습니다. 위의 코드에서 실제로는 Suppliers이라고 가정했습니다.)

+0

네는 공급자의) 난 그냥 LookForIEnumerable는 다음 문제로 끝날 수있는 경우, 분류하는 당신에게 떠날 것입니다 것으로 나타났습니다. 메서드의 서명이 bool IsPropertyOrSubPropertyOf (개체 ObjectInstance, 개체 TargetObejectInstance) 인 경우이 메서드는 Supplier 및 Car에만 해당해서는 안됩니다. 모든 객체의 인스턴스를 전달할 수있는 방식으로 일반화되기를 원합니다. 내가 할 경우 IsPropertyOrSubPropertyOf (supplierInstance, ManufacturerInstance) Supplier 인스턴스가 제조업체 속성의 일부인 경우 계속 true를 반환해야합니다. – Lance

관련 문제