¿Llamar al constructor personalizado con Dapper?

asp.net-membership c# dapper reflection

Pregunta

Intento utilizar 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.

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 del 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.

Traté de hacer una consulta de 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 apoyar mi situación?

** ACTUALIZACIÓN **

La respuesta de Marc para usar el método Query () no genérico / dinámico fue correcta, pero para la posteridad, este es el método al que me refería dentro de 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();  
}

Respuesta aceptada

Yo usaría la API de consulta no genérica aquí ...

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

Al usar esto, puede usar tanto constructores no-predeterminados como asignaciones de propiedades, sin ningún cambio, usando "dinámico" como un paso intermedio.


Respuesta popular

Yo uso esto tal vez es ayudar a alguien

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué