c# 필드 익명 형식의 속성 값을 얻으려면 어떻게해야합니까?




var c# using (10)

Linq 쿼리에 의해 채워진 DataGrid가 있습니다. DataGrid의 포커스가있는 행이 변경되면 해당 객체의 속성 중 하나와 동일한 변수를 설정해야합니다.

나는 시도했다 ...

var selectedObject = view.GetRow(rowHandle);
_selectedId = selectedObject.Id;

...하지만 컴파일러는 전혀 신경 쓰지 않습니다 ( "포함 된 문은 선언 또는 labled 문일 수 없습니다").

재산에 쉽게 접근 할 수 있어야하는 것 같습니다. 런타임 중에 개체를 검사하면 예상 한 모든 속성이 표시되며 액세스 방법을 알 수 없습니다.

익명 객체의 속성에 액세스하려면 어떻게해야합니까?

설명 수정 :

DevExpress XtraGrid 컨트롤을 사용하고 있습니다. 나는이 컨트롤을 여러 다른 객체들로 구성된 Linq 질의로로드 했으므로, 이미 가지고있는 어떤 클래스와도 맞지 않는 데이터를 만들었다. (즉, 나는 이것을 아무 것도 할 수 없다).

.NET 3.5 사용하고 있습니다.

view.GetRow (rowHandle) 메서드의 결과를 볼 때 다음과 같은 익명 형식이 나타납니다.

{ ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }

내 목표는이 익명 형식에서 ClientId를 가져와 다른 작업 (예 : 클라이언트 레코드가있는 폼로드)을 수행하는 것입니다.

초기 답변에서 몇 가지 제안을 시도했지만이 ClientId를 얻을 수있는 지점에 도달하지 못했습니다.


DevExpress의 xtraGridView에는 GetRowCellDisplayText (int rowHandle, GridColumn 열)와 같은 메소드가 있습니다. 이 메서드를 사용하면 다음 코드가 익명 형식의 ID를 반환합니다.

var _selectedId = view.GetRowCellDisplayText(rowHandle, "Id");

이것은 "익명 객체의 속성에 어떻게 접근 할 수 있습니까?"라는 질문에 대한 대답을 제공하지는 않지만 여전히 문제의 근본 원인을 해결하려고 시도합니다.

나는 devXpress 버전 11.1을 사용하여 이것을 시도했으며 거의 ​​2.5 년 전에이 질문에 대해 처음으로 물었습니다. 질문의 저자가 해결책을 찾거나 해결 방법을 찾은 것일 수 있습니다. 아직, 나는 누군가에게 도움이 될 수 있도록 여전히 대답하고있다.


리플렉션을 사용하지 않고 동적 유형을 사용하여 런타임에 익명 유형의 속성에 액세스 할 수 있습니다.

var aType = new { id = 1, name = "Hello World!" };
//...
//...
dynamic x = aType;
Console.WriteLine(x.name); // Produces: Hello World!

동적 유형에 대한 자세한 내용은 다음을 참조하십시오. http://msdn.microsoft.com/en-us/library/dd264736.aspx


다음과 같이 익명 형식의 속성을 반복 할 수 있습니다.

var obj = new {someValue = "hello", otherValue = "world"};
foreach (var propertyInfo in obj.GetType().GetProperties() {
    var name = propertyInfo.Name;
    var value = propertyInfo.GetValue(obj, index: null);
    ...
}

반성을 사용해 본 적이 있습니까? 샘플 코드 스 니펫은 다음과 같습니다.

// use reflection to retrieve the values of the following anonymous type
var obj = new { ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }; 
System.Type type = obj.GetType(); 
int clientid = (int)type.GetProperty("ClientId").GetValue(obj, null);
string clientname = (string)type.GetProperty("ClientName").GetValue(obj, null);

// use the retrieved values for whatever you want...

이것이 도움이되기를 바라며 인터페이스 목록을 전달하고 있습니다.이 목록은 고유 한 목록을 가져와야합니다. 먼저 익명 형식 목록을 얻은 다음 개체 목록으로 전송합니다.

private List<StockSymbolResult> GetDistinctSymbolList( List<ICommonFields> l )
            {
                var DistinctList = (
                        from a
                        in l
                        orderby a.Symbol
                        select new
                        {
                            a.Symbol,
                            a.StockID
                        } ).Distinct();

                StockSymbolResult ssr;
                List<StockSymbolResult> rl = new List<StockSymbolResult>();
                foreach ( var i in DistinctList )
                {
                                // Symbol is a string and StockID is an int.
                    ssr = new StockSymbolResult( i.Symbol, i.StockID );
                    rl.Add( ssr );
                }

                return rl;
            }

이것은 잘못된 것일 수 있습니다 (코드가 충분하지 않을 수 있습니다).하지만 행에 색인을 생성 할 필요가 없으므로 원하는 열을 선택할 수 있습니까? 또는 "Id"가 원하는 열이면 다음과 같이해야합니다.

var selectedObject = view.GetRow(rowHandle);
_selectedId = selectedObject["Id"];

이것이 내가 DataGrid에서 열의 내용을 잡는 방법입니다. 이제 열 자체가 익명 형식 인 경우에는 몰라요.하지만 원시 형식의 명명 된 열을 얻는다면이 방법이 효과적입니다.


익명 형식을 전달하고 재 작성하려고 할 때 궁극적으로 개체 작업을 처리하는 래퍼를 작성하는 것이 더 쉽다는 것을 알게되었습니다. 다음은 블로그 게시물에 대한 링크입니다.

http://somewebguy.wordpress.com/2009/05/29/anonymous-types-round-two/

궁극적으로 코드는 다음과 같이 보일 것입니다.

//create an anonymous type
var something = new {  
  name = "Mark",  
  age = 50  
};  
AnonymousType type = new AnonymousType(something);

//then access values by their property name and type
type.With((string name, int age) => {  
  Console.Write("{0} :: {1}", name, age);  
}); 

//or just single values
int value = type.Get<int>("age");   

코드가 변경 될 때 런타임 오류가 발생하는 것을 두려워하지 않고 수행중인 작업을 알고 있다면 행 데이터를 dynamic 으로 캐스팅 할 수 있습니다.

var data = view.GetRow(rowHandle) as dynamic;  

int clientId      = data.ClientID;
string clientName = data.ClientName;
int jobs          = data.Jobs

컴파일 시간 확인이 없습니다. 그러나 그것은 잘 작동해야합니다.


JaredPar가 정확하게 추측 GetRow() 의 반환 유형은 object 입니다. DevExpress 그리드로 작업 할 때 다음과 같이 원하는 값을 추출 할 수 있습니다.

int clientId = (int)gridView.GetRowCellValue(rowHandle, "ClientId");

이 접근법은 앞에서 설명한 "해커 익명 형식 캐스트"와 유사한 단점을 가지고 있습니다. 열에서 개체와 int 형식 캐스트를 식별하는 마법 문자열이 필요합니다.


var result = ((dynamic)DataGridView.Rows[rowNum].DataBoundItem).value;




anonymous-types