用Dapper調用自定義構造函數?

asp.net-membership c# dapper reflection

我正在嘗試使用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();  
}

一般承認的答案

我會在這裡使用非通用的查詢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();  



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因