2012-01-24 21 views
16

Estoy tratando de usar Dapper para interactuar con las tablas del proveedor de membresía SQL de ASP.NET. Envolví la clase SqlMembershipProvider y agregué un método adicional para obtener los MembershipUsers dados ciertos criterios relacionados con algunas tablas personalizadas que tengo.¿Llamar al constructor personalizado con Dapper?

Al consultar los datos con Dapper, parece que Dapper primero instancia la clase con un constructor sin parámetros, y luego "asigna" las columnas devueltas a las propiedades en el objeto.

Sin embargo, la propiedad UserName en la clase MembershipUser no tiene un setter. A juzgar por la línea 1417 en Dapper SqlMapper.cs, el método GetSettableProps() solo obtiene propiedades configurables.

Intenté hacer una consulta MultiMap para invocar el constructor, pero el problema es que los objetos pasados ​​a la consulta ya no tienen el UserName.

Supongo que podría modificar el método GetSettableProps(), pero no estoy seguro de si eso funcionará, o si afectará a mi código existente.

¿Hay alguna forma de invocar el constructor personalizado que tiene la clase MembershipUser?

¿O hay un cambio razonable que podría hacerle a Dapper para respaldar mi situación?

** ** ACTUALIZACIÓN

la respuesta de Marc utilizar el método no genérico/Consulta dinámica() era correcta, pero para la posteridad, este es el método que se refería a Dapper interior:

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(); 
} 
+0

¿qué línea 1417 mirada al igual que por cierto puede publicar su código de ejemplo para otros que tal vez capaz de ayudarle rápidamente ..? – MethodMan

+1

Para ser sincero, solo usaría un tipo intermedio aquí - o la API de consulta no genérica (que pasa por "dinámico") ... Tengo un código de ctor que podría extraer de protobuf-net, pero yo ' Realmente no estoy seguro de que sea beneficioso ... –

Respuesta

24

me gustaría utilizar la API de consulta no genérico aquí ...

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

el uso de este se puede utilizar tanto co no predeterminado nstructors y asignaciones de propiedad, sin ningún cambio, mediante el uso de "dinámico" como un paso intermedio.

+0

¡Guau, estoy avergonzado de haberlo extrañado! –

+3

Este enfoque te obligará a configurar explícitamente todas las propiedades ¿no? No puedo, por ejemplo, construir mi tipo, y luego hacer que Dapper ejecute su curso en las propiedades con el resultado establecido automáticamente? – crush

+3

No todos trabajan con Framework v4 aún, lo cual es necesario para esta solución que usa dynamic. Parece que puedes salir sin dinámica si usas la indexación del diccionario para obtener los valores de tu columna: así, cuando Marc tiene (int) row.Bar (la fila es dinámica en v4 de Dapper)), puedes usar (int) row [" Bar "] (en la fila Dapper 3.5 es un diccionario) y así sucesivamente. No es agradable, pero en algunas ocasiones tal vez sea necesario. – Nij

1

utilizo este quizás es ayudar a alguien

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