Appelez le constructeur personnalisé avec Dapper?

asp.net-membership c# dapper reflection

Question

J'essaie d'utiliser Dapper pour interfacer avec les tables ASP.NET SQL Membership Provider. J'ai enveloppé la classe SqlMembershipProvider et ajouté une méthode supplémentaire pour obtenir les MembershipUsers en fonction de certains critères relatifs à certaines tables personnalisées que j'ai.

Lors de l'interrogation des données avec Dapper, il apparaît que Dapper instancie d'abord la classe avec un constructeur sans paramètre, puis "mappe" les colonnes renvoyées dans les propriétés de l'objet.

Toutefois, la propriété UserName sur la classe MembershipUser ne possède pas de paramètre. A en juger par la ligne 1417 dans le Dapper SqlMapper.cs, la méthode GetSettableProps() obtient uniquement des propriétés paramétrables.

J'ai essayé de faire une requête MultiMap pour appeler le constructeur, mais le problème avec cela est que les objets passés dans la requête manquent déjà le nom d'utilisateur.

Je suppose que je pourrais modifier la méthode GetSettableProps() , mais je ne sais pas si cela fonctionnera ou si cela affectera mon code existant.

Y a-t-il un moyen d'invoquer le constructeur personnalisé de la classe MembershipUser?

Ou y a-t-il un changement raisonnable que je pourrais apporter à Dapper pour soutenir ma situation?

** MISE À JOUR **

La réponse de Marc pour utiliser la méthode Query () non générique / dynamique était correcte, mais pour la postérité, c'est la méthode à laquelle je faisais référence dans Dapper:

static List<PropInfo> GetSettableProps(Type t)
{
    return t
          .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
          .Select(p => new PropInfo
          {
              Name = p.Name,
              Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true),
              Type = p.PropertyType
          })
          .Where(info => info.Setter != null)
          .ToList();  
}

Réponse acceptée

J'utiliserais l'API de requête non générique ici ...

 return connection.Query(sql, args).Select(row =>
     new AnyType((string)row.Foo, (int)row.Bar) {
         Other = (float)row.Other }).ToList();

En utilisant ceci, vous pouvez utiliser à la fois des constructeurs et des affectations de propriétés autres que les constructeurs, sans aucune modification, en utilisant "dynamic" comme étape intermédiaire.


Réponse populaire

Je l'utilise peut-être que ça aide quelqu'un

YourList = connection.Query<YourQueryClass>(Query, arg)
              .Select(f => new ClassWithConstructor(f.foo,f.bar))
              .ToList();  



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi