2010-10-28 10 views
0

Je souhaite avoir une classe qui définit mes données de paramètre pour une procédure stockée. Ça va être un objet très simple:nHibernate - Propriétés Iterate d'une classe pour ajouter des paramètres génériques pour la procédure stockée

public class MyQueryData : SprocObjectBase 
{ 
    public int Value1 { get; set; } 
    public string Value2 { get; set; } 
    public bool Value3 { get; set; } 
... 
} 

Il héritera d'une classe de base avec des valeurs partagées, comme le nom.

public abstract class SprocObjectBase 
{ 
    public string SprocName { get; set; } 
} 

Types simples pour une conversion facile. Mais, il y aura plus d'un de ces objets, et chacun sera différent.

Ensuite, je veux être en mesure de parcourir les propriétés de l'objet et ajouter les valeurs de paramètre à ma requête, en supposant que les noms de propriété sont mes noms de paramètres sproc. Donc, mon code ressemble à ceci:

public void Execute<T>(T entity) where T : SprocObjectBase 
    { 
     IQuery query = Session.GetNamedQuery(entity.SprocName); 

     var properties = typeof(T).GetProperties(); 

     foreach (var prop in properties) 
     { 
      //?????????????? 
     } 

     query.ExecuteUpdate(); 
    } 

Ma question est, comment puis-je utiliser query.SetParameter<>() avec les informations de propriété dans ma boucle foreach pour ajouter génériquement chaque propriété en tant que paramètre à la procédure stockée?

EDIT: Mon usage courant, qui ne compile pas, ressemble à ceci:

query.SetParameter<prop.GetType()>(prop.Name, prop.GetValue(entity, null)); 

Répondre

1

Je n'ai pas essayé, mais quelque chose comme cela devrait fonctionner:

foreach (var prop in properties) 
    { 
     query.SetParameter(prop.Name, prop.GetValue(entity, null)); 
    } 

Soit dit en passant , jusqu'à présent, vous n'avez pas besoin de rendre la méthode générique. Vous utilisez la réflexion de toute façon.

+0

chéri, je n'ai pas vu cet usage. Erreur de l'utilisateur Merci Stefan. – Josh