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




var c# using (8)

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

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

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

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

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를 얻을 수있는 지점에 도달하지 못했습니다.


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

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

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


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

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


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

// 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;
            }

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

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");   

주어진 키에 대한 데이터 항목의 값을 얻기위한 일반적인 솔루션

public static T GetValueFromAnonymousType<T>( object dataitem, string itemkey ) {
    System.Type type = dataitem.GetType();
    T itemvalue = (T)type.GetProperty(itemkey).GetValue(dataitem, null);
    return itemvalue;
}

예:

var dataitem = /* Some value here */;
bool ismember = TypeUtils.GetValueFromAnonymousType<bool>(dataitem, "IsMember");

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

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

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

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





anonymous-types