2009-10-21 61 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;在反射使用的PropertyInfo,我怎樣才能實現作爲

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance) 

的方法,如

bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance) 

此方法將返回true,如果CarInstance財產製造商已經具有SupplierName SupplierNameInstance

回答

2

這是否在執行您的要求?對不起,如果它不是最乾淨的 - 你可能會想在那裏添加一些空檢查。

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

編輯:剛纔我注意到,如果LookForIEnumerable,那麼你可以用一個問題結束了,會留給你理清;)

+0

我認爲在我的情況下,LookFor不會是IEnumerable。我會嘗試這個邏輯,如果它能工作,我強烈認爲它會。 – Lance 2009-10-22 07:16:39

+0

它的工作原理,我只是添加了一個深度參數,以表明它將挖掘子屬性有多深,因爲它似乎是一個永無止境的循環。當然,空檢查和一些異常處理。非常感謝。 – Lance 2009-10-22 09:26:15

+0

這對我的應用程序來說有點滯後,但我認爲,使用Microsoft的新任務並行庫(TPL)將有所幫助。 – Lance 2009-10-22 09:42:20

2
一個供應商

對於您描述的特定示例,您不需要使用反射:

bool IsPropertyOrSubPropertyOf(Supplier supplierInstance, Car carInstance) 
{ 
    return carInstance.Manufacturer.Suppliers.Contains(supplierInstance); 
} 

(順便說一下,您錯過了Manufacturer課中List<Supplier>屬性的名稱。我假設它在上面的代碼中實際上被稱爲Suppliers)。

+0

沒錯這就是供應商。 假設方法的簽名是 布爾IsPropertyOrSubPropertyOf(對象ObjectInstance,它對象TargetObejectInstance) 該方法應當不特定於供應商和車輛。我希望它是通用的,你可以通過任何對象的任何實例。如果我做 IsPropertyOrSubPropertyOf(supplierInstance,ManufacturerInstance) 如果供應商實例是製造商屬性的一部分,它仍應該返回true。 – Lance 2009-10-22 02:32:34