Dapper로 커스텀 생성자를 호출 하시겠습니까?

asp.net-membership c# dapper reflection

문제

Dapper를 사용하여 ASP.NET SQL 멤버십 공급자 테이블과 인터페이스하려고합니다. SqlMembershipProvider 클래스를 래핑하고 추가 메서드를 추가하여 MembershipUsers에게 주어진 일부 사용자 지정 테이블과 관련된 특정 조건을 가져 왔습니다.

Dapper를 사용하여 데이터를 쿼리 할 때 Dapper는 먼저 매개 변수가없는 생성자로 클래스를 인스턴스화 한 다음 반환 된 열을 객체의 속성에 "매핑"하는 것으로 나타납니다.

그러나 MembershipUser 클래스의 UserName 속성에는 setter가 없습니다. Dapper SqlMapper.cs의 1417 줄에서 보았을 때 GetSettableProps() 메서드는 settable 속성 만 가져 GetSettableProps() .

생성자를 호출하기 위해 MultiMap 쿼리를 시도했으나 쿼리에 전달 된 개체에 이미 UserName이 누락되어 있습니다.

나는 GetSettableProps() 메서드를 수정할 수 있다고 생각하지만 작동하는지 또는 기존 코드에 영향을 GetSettableProps() 확실하지 않습니다.

어쨌든 MembershipUser 클래스에있는 사용자 지정 생성자를 호출 할 수 있습니까?

또는 Dapper에게 나의 상황을 지원할 수있는 합리적인 변화가 있습니까?

** 업데이트 **

비 일반 / 동적 Query () 메서드를 사용하는 Marc의 대답은 정확했지만, 후자의 경우 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();

이것을 사용하면 "dynamic"을 중간 단계로 사용하여 변경하지 않고 기본값이 아닌 생성자와 속성 할당을 모두 사용할 수 있습니다.


인기 답변

나는 이걸 누군가에게 도움이 될지도 모른다.

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는 합법적입니까? 예, 이유를 알아보십시오.