변수 / 동적 집합 필드를 사용하여 C #에서 익명 형식을 선언 할 수 있습니까?

anonymous-types c# dapper dynamic

문제

C #에서는 런타임까지 필드를 알 수없는 익명 형식을 선언 할 수 있는지를 알고 싶습니다.

예를 들어 키 / 값 쌍 목록이있는 경우 해당 목록의 내용을 기반으로 익명 형식을 선언 할 수 있습니까? 필자가 작업하고있는 구체적인 사례는 Dapper에게 매개 변수를 전달하는 것입니다. Dapper에는 미리 매개 변수가 몇 개인 지 미리 알 수 없습니다.

new { key1=value1, key2=value2, ... }

이 목록 (또는 해당하는 Map)을 쿼리 매개 변수로 Dapper에 전달할 수있는 익명 형식으로 변환하고 싶습니다. 그래서 위의 목록은 익명 형식으로 정의 된 경우 다음과 같이 표시됩니다.

new { key1=value1, key2=value2, ... }

나는 그들이 ( "EXTENDO 객체")를 선언 한 후 익명 형식을 확장하거나이 만들어지는 후 개체에 대한 임의의 필드 선언에 대한 질문에 StackOverflow에 대한 몇 가지 질문을 본 적이 있지만 나는 ... 난 그냥 필요 할 필요가 없습니다 유형을 동적으로 한 번 앞에서 선언해야합니다. 나의 의혹은 그것이 가능하다면 약간의 멋진 반영을 필요로 할 것이라는 것이다.

내 이해 컴파일러는 컴파일 타임에 후드 아래 익명 클래스에 대한 형식을 정의합니다, 그래서 그 클래스의 필드는 런타임까지 사용할 수없는 경우, 나는 운이 없을 수도 있습니다. 내 유스 케이스는 실제 언제든지 임의의 필드를 정의 할 때 "extendo 객체"를 사용할 때와 다를 수 있습니다.

또는 쿼리 매개 변수를 Dapper (익명 클래스를 선언하는 대신)로 전달하는 더 좋은 방법을 알고있는 사람이라면 그 사실에 대해서도 듣고 싶습니다.

감사!

최신 정보

이 일로 늦어 져서 미안해! 이 답변들은 모두 훌륭했습니다. 나는 모두에게 점수를 줄 수 있기를 바랍니다. 나는 jbtule의 솔루션 (Sam Saffron 편집)을 사용하여 IDynamicParameters를 Dapper에 전달하여 결국 그에게 답을 주어야한다고 느꼈다. 다른 답변도 좋았으며 내가 물어 본 특정 질문에 답변했습니다. 나는이 모든 사람들의 시간에 정말로 감사드립니다!

수락 된 답변

Dapper의 제작자는이 문제를 잘 알고있었습니다. 이러한 종류의 기능은 INSERTUPDATE 헬퍼에 정말로 필요합니다.

Query , ExecuteQueryMultiple 메서드는 dynamic 매개 변수를 사용합니다. 익명 형식, 구체 형식 또는 IDynamicParameters 를 구현하는 개체가 될 수 있습니다.

var p = new DynamicParameters();
p.AddDynamicParams(new{a = "1"});
p.AddDynamicParams(new{b = "2", c = "3"});
p.Add("d", "4")
var r = cnn.Query("select @a a, @b b, @c c, @d d", p);
// r.a == 1, r.b == 2, r.c == 3, r.d == 4

이 인터페이스는 매우 편리합니다. AddParameters 는 SQL을 실행하기 직전에 호출됩니다. 이 기능은 SQL로 전송 된 매개 변수에 대한 풍부한 제어 기능을 제공 할뿐만 아니라, 명령에 대한 액세스 권한이 있으므로 DB 관련 DbParameters를 연결할 수 있습니다 (db 전용으로 캐스팅 할 수 있음). 이렇게하면 표 값 매개 변수 등을 지원할 수 있습니다.

Dapper에는 DynamicParameters 라는 용도로 사용할 수있는이 인터페이스의 구현이 포함되어 있습니다. 이렇게하면 익명 매개 변수 백을 둘 다 연결하고 특정 값을 추가 할 수 있습니다.

AddDynamicParams 메서드를 사용하여 익명 형식을 추가 할 수 있습니다.

var p = new DynamicParameters();
p.AddDynamicParams(new{a = "1"});
p.AddDynamicParams(new{b = "2", c = "3"});
p.Add("d", "4")
var r = cnn.Query("select @a a, @b b, @c c, @d d", p);
// r.a == 1, r.b == 2, r.c == 3, r.d == 4

인기 답변

C #에서는 런타임까지 필드를 알 수없는 익명 형식을 선언 할 수 있는지를 알고 싶습니다.

익명 형식은 컴파일러에서 생성됩니다. 컴파일러가 컴파일러에서 알지 못하는 필드 유형을 가진 컴파일러 생성 유형 생성할지 여부를 알고 싶습니다. 분명히 그렇게 할 수는 없습니다. 당신이 올바르게 추측 할 때, 당신은 운이 없다.

StackOverflow에서 익명 형식을 선언 한 후 확장하는 방법에 대해 묻는 몇 가지 질문을 보았습니다 ( "extendo 개체").

우리는 일반적으로 그 "expando"객체를 호출합니다.

원하는 작업이 키 - 값 쌍 사전을 기반으로 expando 객체를 만든 다음 ExpandoObject 클래스를 사용하여이를 수행합니다. 자세한 내용은이 MSDN 문서를 참조하십시오.

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

런타임에 선의의 .NET 클래스를 생성하려는 경우 수행 할 수 있습니다. 당신이 올바르게 메모를 할 때, 당신은 그렇게하기 위해 멋진 반영이 필요합니다. 당신이하고자하는 것은 수집 가능한 어셈블리를 만드는 것입니다 (소위 정상적인 어셈블리와는 달리이를 런타임에 생성하고 가비지 컬렉터가 작업을 완료하면이를 정리합니다).

수집 가능한 어셈블리를 만들고 TypeBuilder를 사용하여 수집 가능한 어셈블리를 생성하는 방법에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/dd554932.aspx 를 참조 하십시오 .




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.