2009-10-21 3 views
0

Comment saurai-je si une instance d'objet est une propriété ou une sous-propriété d'une autre instance d'objet?Comment est-ce que je ferai une propriété forer vers le bas?

par exemple j'avoir cette structure de classe:

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

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

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

Et je n'ai que deux cas, la voiture et le NomFournisseur; L'utilisation PropertyInfo en réflexion, Comment puis-je mettre en œuvre une méthode telle que

bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance) 

utilisé comme

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance) 

cette méthode retourne true si la propriété de CarInstance fabricant a un fournisseur qui a une NomFournisseur SupplierNameInstance

Répondre

2

Est-ce que cela fait ce que vous cherchez? Désolé si ce n'est pas le plus propre - vous voudrez probablement ajouter quelques vérifications nulles là aussi.

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

Edit: Je viens de remarquer que si LookFor est IEnumerable alors vous pouvez vous retrouver avec un problème, partirez que vous pour trier;)

+0

Je pense que LookFor, dans mon cas, ne sera pas un IEnumerable. Je vais essayer cette logique si ça va marcher, et je crois fermement que ça va marcher. – Lance

+0

Cela a fonctionné, j'ai juste ajouté un paramètre de profondeur pour indiquer à quelle profondeur il va creuser les propriétés sub car il semble être une boucle sans fin sans cela. Et bien sûr, les vérifications nuls et quelques exceptions de gestion. Merci beaucoup. – Lance

+0

C'est un peu lent pour mon application mais je pense que l'utilisation de la nouvelle bibliothèque Task Parallel (TPL) de Microsoft aidera. – Lance

2

Vous ne devriez pas avoir besoin d'utiliser la réflexion pour l'exemple particulier que vous décrivez:

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

(En passant, vous avez manqué le nom de la propriété List<Supplier> dans votre classe Manufacturer. J'ai supposé que c'est effectivement appelé Suppliers dans mon code ci-dessus.)

+0

Oui, c'est Fournisseurs. En supposant que la signature de la méthode est bool IsPropertyOrSubPropertyOf (objet ObjectInstance, objet TargetObejectInstance) la méthode ne doit pas être spécifique à un fournisseur et une voiture. Je veux qu'il soit générique de manière à pouvoir transmettre n'importe quelle instance d'un objet. Si je fais IsPropertyOrSubPropertyOf (supplierInstance, ManufacturerInstance) il devrait toujours renvoyer true si l'instance du fournisseur fait partie de la propriété du fabricant. – Lance

Questions connexes