2009-11-16 2 views
3

제 질문은 MVC의 SelectList (및 그 이전 세대)의 질문에 기인합니다. 기본적으로 클래스는 IEnumerable을 사용하고 사용자가 정의한 멤버를 문자열로 사용합니다.C#에서 문자열을 통해 멤버 가져 오기?

  1. 은 어떻게 객체와 인터페이스 않는 (주조, 반사?)
  2. (아마 중복) 어떻게 문자열로 구성원을 조회한다.

이 내가 관심이되었지만 :(

의 예

편집 찾을 수 없을 수의 C#의 한면이다

내가 DataBinder.Eval를 사용하여 종료를() System.Web.UI에서

여전히 반사 오버 헤드가 있지만 개체를 ​​전달하고 을 포함하는 문자열을 전달하면 작업이 더 쉬워집니다. 원하는 회원의 계층 구조. 지금은 그다지 의미가 없지만이 프로젝트는 Linq 데이터를 사용하도록 설계되었으므로 도로를 염려 할 필요가 없으므로 내 인생을 좀더 쉽게 할 수 있습니다.

도움을 주신 모든 분들께 감사드립니다.

답변

4

확실한 구현 방법을 알지 못하더라도 리플렉션을 사용하기를 기대합니다.

기본적으로 Type.GetProperty 또는 Type.GetMethod을 호출하여 관련 멤버를 얻은 다음 특정 인스턴스에 대한 해당 속성의 값을 요청하거나 메서드 등을 호출하십시오. 또는 Type.GetMembers, Type.GetMember

"Person.Mother.Name"또는 이와 유사한 "경로"를 사용할 수있게하려면 내가 아는 한 자신을 분석해야합니다. (이 당신을 위해 그것을 할 수있는 프레임 워크의 비트 수 있지만 반사 API에 아니에요 수 있습니다.)

다음은 짧지 만 완전한 예제 :

using System; 
using System.Reflection; 

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

class Test  
{ 
    static void Main() 
    { 
     Person jon = new Person { Name = "Jon", Age = 33 }; 
     ShowProperty(jon, "Name"); 
     ShowProperty(jon, "Age"); 
    } 

    static void ShowProperty(object target, string propertyName) 
    { 
     // We don't need no stinkin' error handling or validity 
     // checking (but you do if you want production code) 
     PropertyInfo property = target.GetType().GetProperty(propertyName); 
     object value = property.GetValue(target, null); 
     Console.WriteLine(value); 
    } 
} 
+0

@Downvoter : 이유를주는주의? 내가 실수 한거야? 오류 검사 등의 완전한 부족을 인정하지 않습니까? –

+0

이것은 작동하지만, (member.submember [1] .value와 같은) 표현식을 취하는 DataBinder.Eval()도 있습니다. 이것은 MultiSelectList/SelectList가 사용하는 것입니다. 페이지 컨트롤에 넥타이가있는 것처럼 보이므로 부작용이있을 수 있습니다 ...이 작업을 마치면 내가 사용한 것을 게시 할 것입니다. – Matt

+0

@envalid : 나에게 좋은 계획처럼 들리네. :) –

1

예, 반사를 통해. Type 클래스 및 관련 메소드를 살펴보십시오. 시작하기 좋은 곳은 here 일 수 있습니다.

MVC의 source에서도 예제를 볼 수 있습니다.

관련 문제