Dapper는 읽기 전용 속성을 어떻게 설정할 수 있습니까?

게오르기 레인지 로프

Dapper 및 C # 읽기 전용 자동 속성 (C # 6에서 도입 됨) 과 관련된 다음 동작을 발견했습니다 .

Dapper는 읽기 전용 속성 집합을 사용하여 클래스의 인스턴스를 매핑 할 수 있는데, 읽기 전용 속성이 작동하는 방식에 대한 이해에 따르면 불가능합니다.

다음 코드는이를 실제로 보여줍니다.

using Dapper;
using Npgsql;
using System;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Model
    {
        public long Id { get; }
    }

    class Program
    {
        static async Task<Model> GetData()
        {
            using (var connection = new NpgsqlConnection("..."))
            {
                await connection.OpenAsync();

                var sql = @"
                    SELECT 22 AS Id";

                return await connection.QuerySingleAsync<Model>(sql);
            }
        }

        static async Task Main(string[] args)
        {
            var model = await GetData();
            Console.WriteLine(model.Id);

            var model2 = new Model();
            //model2.Id = 22;

            var model3 = new Model
            {
                //Id = 22;
            };
        }
    }
}

주석 처리 된 줄 은 예상대로 컴파일 타임 오류 CS0200생성 합니다.

데이터베이스 설정이 필요하지 않고 작동하는 SQL 연결 만 필요합니다 (Postgres를 사용하고 있습니다). GetData에서 반환 된 모델에는 Id 속성이 설정되어 있습니다. Model 클래스의 인스턴스를 수동으로 만들려고하면 읽기 전용이므로 Id 속성을 설정할 수 없습니다.

Dapper가 어떻게 속성을 설정할 수 있는지 궁금합니다. Dapper 리포지토리의 코드를 따라 시도했지만 이해 수준 이상입니다.

나는 마법이 일어나고 있다고 생각하는 SqlMapper.cs # L1530 을 따라갈 수 있었지만 그 지점을 넘어서는 것은 따라 가기가 너무 어렵습니다.

누군가가 간단한 용어로 설명 할 수 있다면 감사 할 것입니다. :)

감사합니다.

이안 켐프

내부적으로 선언 :

public long Id { get; }

실제로 다음 C # 코드로 컴파일됩니다.

[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly long <Id>k__BackingField;

public long Id
{
    [CompilerGenerated]
    get
    {
        return <Id>k__BackingField;
    }
}

Reflection을 사용하면 꽤 미친 일을 할 수 있습니다. 그리고 그 중 하나는으로 표시된 필드의 값을 설정하는 것입니다 readonly. (이는 string.Empty원하는대로 설정할 수 있다는 것과 같은 흥미로운 의미가 있습니다!)

Dapper의 경우 다음을 효과적으로 수행하지만 훨씬 더 많은 오류 검사를 수행합니다.

Model m = <instance of your Model class>;
Type t = m.GetType();
string propertyName = "Id"; // read using Reflection
FieldInfo fi = t.GetField("<" + propertyName + ">k__BackingField",
    BindingFlags.Instance | BindingFlags.NonPublic);
if (fi != null)
    fi.SetValue(m, 22); // 22 = value read from DB

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Razor에서 읽기 전용 속성을 어떻게 설정할 수 있습니까?

Javascript를 사용하여 달러 기호로 끝나는 속성을 어떻게 설정할 수 있습니까?

읽기 전용 액세스 권한 만있는 경우 어떻게 Ansible을 사용할 수 있습니까?

TypeScript에서 읽기 전용 속성을 어떻게 변경할 수 있습니까?

JsonSubTypes 설정에 사용되는 속성을 어떻게 유지할 수 있습니까?

읽기 전용 속성으로 ID를 사용하는 컨트롤러를 어떻게 테스트 할 수 있습니까?

Postgres를 사용하는 Rails 5.2에서 날짜의 기본값을 어떻게 설정할 수 있습니까?

프로토 타입을 할당하기 전에도 속성 값을 어떻게 사용할 수 있습니까?

이 tinymce의 초기 내용/값을 어떻게 설정할 수 있습니까?

NVM을 사용하여 기본 노드 버전을 어떻게 설정할 수 있습니까?

iOS에서 KVC를 사용하여 값을 읽기 전용 속성으로 설정할 수 있습니까?

strictFileInteractability 속성을 어떻게 설정할 수 있습니까?

파생 클래스의 읽기 전용 속성 유형을 어떻게 좁힐 수 있습니까?

조건부로 테이블 행에 읽기 전용 속성을 어떻게 만들 수 있습니까?

특정 유형의 모든 Bean 목록으로 Bean 속성을 설정하기 위해 Spring XML 구성을 어떻게 사용할 수 있습니까?

새로 생성 된 요소 속성을 설정하기 위해 함수 콜백을 어떻게 사용할 수 있습니까?

Sphere.IO : 제품 생성 중에 사용자 정의 속성을 어떻게 설정할 수 있습니까?

해당 속성의 값을 설정할 수있는 생성자와 함께 읽기 전용 속성이 필요한 것은 무엇입니까?

Angular 서비스 기능을 어떻게 사용할 수 있습니까? 오류 발생 : "Undefined 속성을 읽을 수 없습니다."

ResourceDictionary에서 배경 속성에 사용할 수있는 기본 색상을 설정하려면 어떻게해야합니까?

HTML에서 이미지의 "src"속성을 설정하기 위해 JavaScript에서 생성 된 변수를 어떻게 사용할 수 있습니까?

@ Html.TextBoxFor ()를 읽기 전용 또는 비활성화로 어떻게 만들 수 있습니까?

(.xslx 또는 .pdf) URL을 사용하여 react / javascript에서 xslx, pdf 파일을 어떻게 표시 (읽기 전용) 할 수 있습니까?

값을 수정하고 변경하려는 기존 열이 있는 경우 R을 사용하여 조건문을 어떻게 설정할 수 있습니까?

폴더 / 파일 / 등을 어떻게 삭제할 수 있습니까? 읽기 전용 DVD + R?

lua에서 읽기 전용 테이블을 어떻게 구현할 수 있습니까?

속성이 수정 될 때 트리거되는 중단 점을 어떻게 설정할 수 있습니까?

파티션 또는 드라이브의 읽기 / 쓰기 속도는 어떻게 측정 할 수 있습니까?

요소의 데이터 속성을 읽는 특정 변수를 어떻게 얻을 수 있습니까?

TOP 리스트

  1. 1

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  2. 2

    std :: regex의 일관성없는 동작

  3. 3

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  4. 4

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  5. 5

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  6. 6

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  7. 7

    Ionic 2 로더가 적시에 표시되지 않음

  8. 8

    Seaborn에서 축 제목 숨기기

  9. 9

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  10. 10

    복사 / 붙여 넣기 비활성화

  11. 11

    ArrayBufferLike의 typescript 정의의 깊은 의미

  12. 12

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  13. 13

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  14. 14

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  15. 15

    PRNG 기간보다 순열이 더 많은 목록을 무작위로 섞는 방법은 무엇입니까?

  16. 16

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  17. 17

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  18. 18

    잘못된 구성 개체입니다. Webpack이 Angular의 API 스키마와 일치하지 않는 구성 개체를 사용하여 초기화되었습니다.

  19. 19

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  20. 20

    R의 마침표와 숫자 사이에 문자열 삽입

  21. 21

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

뜨겁다태그

보관