2010-08-23 6 views
1

Après un échantillon de mon code:C# réflexion sur le modèle générique classe

public abstract class<T> 
{ 
    public List<T> GetSomething(string q) 
    { 
     **List<T> list = new List<T>();** 

     Type type = typeof(T); 
     PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance); 

     foreach (PropertyInfo info in props) 
     { 
      // at this point I need to return information from a data source query 
      // and build the members (set values) according to the returning results 
      // which needs to be added to a list that contains T with each property 
      // within set to a value. "Some Value" should be an object instance required 
      // by the Type of the PropertyInfo. 

      info.SetValue(type, "Some Value", null); 
      **list.Add(type);** 
     } 
    } 

    **return list;** 
} 

info.SetValue (objet, objet, objet []) n'est pas accessible, en raison du type de modèle, correct? Ma question ici serait, comment puis-je définir une valeur sur une propriété, contenue dans T?

Editer: La question me confondait même. J'ai modifié la procédure ci-dessus pour représenter mes besoins directs.

Merci, Eric

+2

Quelle est votre cible? La propriété correspondant à "info" est-elle statique? Quel est l'objet sur lequel vous essayez de définir cette valeur de propriété? –

+1

Votre question est trop confuse. – leppie

+1

Qu'est-ce que cette méthode est censée faire exactement? En ce moment vous l'avez retourné une liste et appelé GetSomething, mais vous ne retournez rien et, en réalité, vous essayez de définir quelque chose au lieu de l'obtenir. –

Répondre

2

Je ne vois pas comment cela a un sens. Vous essayez de définir une propriété sur une instance de T (comme indiqué par vos bindingflags), mais vous passez typeof(T) - un Type - à PropertyInfo.SetValue comme premier argument. Peut-être vous dire:

public abstract class Foo<T> 
{ 
    public List<T> GetSomethingFrom(T instance) 
    { 
     Type type = typeof(T); 
     PropertyInfo[] props = type.GetProperties(BindingFlags.Public | 
      BindingFlags.IgnoreCase | BindingFlags.Instance); 

     foreach (PropertyInfo info in props) 
     { 
      info.SetValue(instance, "Some Value", null); 
     } 
    } 
} 

Dans ce cas, nous transmettons une instance de T à la méthode GetSomethingFrom, en passant ensuite par exemple à SetValue. Suivre?

-Oisin

0

Il serait sans doute une bonne idée d'affirmer que les propriétés que vous configurez sont en fait des chaînes aussi bien ou votre appel à SetValue (par exemple, « une certaine valeur », null) va jeter.

Il semble que vous essayez de créer un initialiseur d'objet générique. La réflexion fonctionnera, mais je recommanderais d'explorer l'espace de noms System.Linq.Expressions. Vous pouvez utiliser la réflexion pour construire une LambdaExpression que vous pouvez compiler dynamiquement dans une méthode qui aura alors de bien meilleures performances que d'initialiser vos objets avec la réflexion à chaque fois.

Questions connexes