2012-11-21 1 views
0

J'ai ce code que j'adapte actuellement pour utiliser l'entité imbriquée (framework d'entité). J'ai une entité qui contient 2 propriétés qui sont 2 entités enfants.Comment itérer sur un objet T pour trouver une propriété?

La première étape consistait à lire les métadonnées sur les deux classes, à partir des premières classes, en créant une liste de propriétés. Ceci est terminé. Maintenant, j'ai besoin d'itérer sur mon objet pour trouver la bonne propriété pour faire le DataBinding.

C'est ce que j'ai actuellement:

variables Exemple:

datasource = namespace.A 
propriete = {System.Nullable`1[System.Int32] count} 
propriete.DeclaringType {Name = "prop2" FullName = "Namespace.Metadata.prop2"} 

Code:

if (this.datasource != null) 
{ 
    var y = (T)this.datasource; 

    var propList = typeof(T).GetProperties(); 
    if (propList.ToList().Contains(propriete)) 
    { 
     TextBox.Text = DataBinder.Eval(y, propriete.Name).ToString(); 
    } 
    else 
    { 
     TextBox.Text = ":(need child-support!"; 
    } 
} 

Mon principal problème est que mon type d'objet est inconnu jusqu'à ce que l'exécution (de type T) donc je n'ai aucune idée sur la façon de trouver mon domaine.

modèle rapide:

Class A { 
    public B prop1; 
    public C prop2; 
} 

Class B { 
    int count; 
    string name; 
} 

Class C { 
    int count; 
    string name; 
} 

A.prop1.count = 1; 
A.prop1.name = "a"; 
A.prop2.count = 2; 
A.prop2.name = "b"; 

En ce moment, mon nom de la propriété sont tous uniques (plus précis que compte/nom), mais je les attendre à être le même (compte/nom) à un moment donné.

propriétaire devra probablement "filtrer" avec DeclaringType/ReflectedType pour un nom non unique.

Une solution de force brute prenant en compte un nom unique, bien que non élégant, pourrait être acceptée.

problème supplémentaire: propriete utilisation autre classe partielle contient dans l'espace de noms metadata en datasource utiliser la classe principale.

(... Et si vous êtes curieux de savoir ce que ce système fait. Il construit une table html (avec des commandes .net) basé sur une entité basée sur cette metadata.entity DataAttribute)

+0

voulez-vous utiliser 'IIterable' au lieu de' T'? –

+0

Voulez-vous dire 'IIterable '? Je ne vois pas comment je pourrais transformer mon type de classe en une liste ... – Kraz

Répondre

0

Voici ce que j'ai fini avec:

if (this.datasource != null) 
{ 
    var y = (T)this.datasource; 

    var propList = typeof(T).GetProperties(); 
    //try to assign the prop but it might be on a child-prop. 
    try 
    {   
     retour = DataBinder.Eval(y, propriete.Name).ToString(); 
    } 
    catch 
    { 
     foreach (PropertyInfo prop in propList) 
     { 
      if ((prop.PropertyType).FullName.Contains("Env.")) 
      { 
       var childPropList = prop.PropertyType.GetProperties(); 
       foreach (PropertyInfo childProp in childPropList) 
       { 
        if (((System.Reflection.MemberInfo)(childProp)).Name == propriete.Name) 
        { 
         var x = DataBinder.GetPropertyValue(y, prop.Name); 
         retour = DataBinder.Eval(x, propriete.Name).ToString(); 
        } 
       } 
      } 
     } 
    } 
} 

Pour l'instant il fonctionne, mais il pourrait ne pas être assez polyvalent dans un avenir proche.

0

Vous pouvez accéder aux informations de type en appelant GetType() sur une instance. Donc, dans votre cas, il serait:

var propList = this.datasource.GetType().GetProperties() 
+0

Ce n'est pas ce qu'il cherche. – SLaks

+0

Ce que vous suggérez utilise exactement le même résultat que cette ligne que j'ai déjà: 'var propList = typeof (T) .GetProperties();'. – Kraz

+0

L'avez vous essayé? Parce que cela va obtenir les propriétés d'une instance. Donc, vous n'avez pas besoin de connaître le type à l'avance ... – Rashack

Questions connexes