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

C# 用Dapper调用自定义构造函数?,c#,reflection,asp.net-membership,dapper,C#,Reflection,Asp.net Membership,Dapper,我正在尝试使用Dapper与ASP.NET SQL成员资格提供程序表进行接口。我包装了SqlMembershipProvider类,并添加了一个额外的方法,以便在给定与某些自定义表相关的特定条件时获得MembershipUsers 使用Dapper查询数据时,Dapper似乎首先使用无参数构造函数实例化类,然后将返回的列“映射”到对象的属性中 但是,MembershipUser类的UserName属性有一个no setter。从Dapper SqlMapper.cs中的第1417行左右判断,方法

我正在尝试使用Dapper与ASP.NET SQL成员资格提供程序表进行接口。我包装了SqlMembershipProvider类,并添加了一个额外的方法,以便在给定与某些自定义表相关的特定条件时获得MembershipUsers

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

但是,MembershipUser类的UserName属性有一个no setter。从Dapper SqlMapper.cs中的第1417行左右判断,方法
GetSettableProps()
仅获取可设置属性

我尝试执行多映射查询来调用构造函数,但问题是传递到查询中的对象已经缺少用户名

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

我是否可以调用MembershipUser类拥有的自定义构造函数?

或者我是否可以对Dapper进行合理的更改以支持我的情况?

**更新**

Marc使用非泛型/dynamic 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();  
}
静态列表GetSettableProps(类型t)
{
返回t
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.选择(p=>new PropInfo
{
名称=p.名称,
Setter=p.DeclaringType==t?p.GetSetMethod(true):p.DeclaringType.GetProperty(p.Name).GetSetMethod(true),
类型=p.PropertyType
})
.Where(info=>info.Setter!=null)
.ToList();
}

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

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

通过使用“动态”作为中间步骤,您可以使用非默认构造函数和属性赋值,而无需任何更改。

我使用它,也许它对某人有帮助

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

第1417行看起来像什么顺便说一句,你能为其他人发布你的代码示例吗,也许可以快速帮助你….?老实说,我在这里只使用中间类型-或者非通用查询API(通过“动态”)。。。我有一些ctor代码可以从protobuf网络中提取出来,但我真的不确定它是否有益……哇,我很尴尬,我完全错过了它!这种方法将迫使您显式设置所有属性,不是吗?例如,我不能构造我的类型,然后让Dapper自动在结果集的属性上运行它的过程?还不是每个人都使用Framework v4,这是使用dynamic的解决方案所必需的。如果您使用字典索引来获取列值,似乎可以不使用动态:因此,在Marc有(int)row.Bar(row在Dapper的v4中是动态的)的地方,您可以使用(int)row[“Bar”](在Dapper 3.5中row是字典)等等。这并不令人愉快,但在某些情况下可能是必要的。不幸的是,它仍然是动态(缓慢)对象。最好有像public AgragatedRootEntity(int-id、字符串名称、选项、维度)这样的映射,而没有动态。@Artem如果不喜欢动态,可以转换为IDictionary