用Dapper调用自定义构造函数?

Joh*_*ski 18 c# reflection asp.net-membership dapper

我正在尝试使用Dapper与ASP.NET SQL Membership Provider表进行交互.我包装了SqlMembershipProvider类并添加了一个额外的方法来获取MembershipUsers给出一些与我的一些自定义表相关的标准.

使用Dapper查询数据时,似乎Dapper首先使用无参数构造函数实例化该类,然后将返回的列"映射"到对象的属性中.

但是,MembershipUser类上的UserName属性没有setter.从Dapper SqlMapper.cs中的第1417行开始,该方法GetSettableProps()只获得可设置的属性.

我试图做一个MultiMap查询来调用构造函数,但问题是传递给查询的对象已经缺少UserName.

我猜我可以修改GetSettableProps()方法,但我不确定这是否有效,或者它是否会影响我现有的代码.

反正我是否要调用MembershipUser类具有的自定义构造函数?

或者我是否可以对Dapper做出合理的改变以支持我的情况?

**更新**

Marc使用非泛型/动态Query()方法的答案是正确的,但对后人来说,这是我在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();  
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 32

我会在这里使用非通用的查询API ...

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

使用此方法,您可以使用"动态"作为中间步骤,同时使用非默认构造函数和属性赋值,而无需任何更改.

  • 这种方法会强制你明确设置所有属性不会吗?例如,我不能构造我的类型,然后让Dapper在属性上自动运行结果集? (5认同)
  • 并非所有人都使用Framework v4,这是使用动态的此解决方案所必需的.如果使用Dictionary索引来获取列值,似乎你可以在没有动态的情况下离开:因此Marc有(int)row.Bar(行在Dapper的v4中是动态的)),你可以使用(int)row [" Bar"](在Dapper 3.5行中是一个字典)等等.这不愉快,但在某些情况下可能是必要的. (5认同)