2011-02-22 3 views
3

내가C#을 여러 표현

나는 이런 식으로 뭔가를 부를 것이다 사용하여 다양한 유형의 여러 특성을 취하는 방법 서명을 만들려고 해요 parameteres 등록 정보의 유형이 동일해야합니다. 나는 속성 이름만을 사용할 것이지만 람다 표현식을 사용하여 쉬운 리팩토링을 가능하게하고 싶다.

public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression) 
+0

질문에서 마지막 코드를 이해하지 못합니다. 그게 당신이 시도하고 효과가없는 것입니까? 의사 코드인가요? – Gabe

+0

여기서 람다를 사용하는 목적을 이해하지 못합니다. params object []를 사용하여 어떤 값이라도 받아 들일 수는 없습니까? 이름 만 원하면 문자열 만 받아 들일 수 있습니다. – recursive

+0

재귀 : 요점은 이런 식으로 액세스가 강력하게 형식화 된 것입니다. 문자열의 경우 하드 코딩 된 반면 리팩토링 알고리즘은 컴파일러가 검사하지 않고 컴파일러 오류가 아닌 런타임 예외가 발생합니다. – Femaref

답변

3

내가 AllPropertiesExcept(params Expression<Func<object>>[] properties) 사용합니다, 당신은 여전히 ​​그것에서 속성 이름을 얻을 수 있지만 재산이 입력 한 내용을 중요하지 않습니다.

편집 :하지만 다른 방법으로 사용하는 경향이 있습니다.보고 싶지 않은 속성을 제외하는 대신보고 싶은 속성이 포함됩니다. 이유는 간단합니다 - 당신의 방식으로 일을하고, 당신은 여전히 ​​반사가 필요합니다 - 내 방식으로, 당신은 쉽게 Func을 사용하여 직접 실제 데이터를 얻을 수 있습니다.

편집 2 (식 중 속성 이름을 얻는) :

Expression<Func<object>> obj = something; // you get this in your method 

((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name 

정말, 그런 것들에 대한 LinqPad를 사용하도록 조언 해 줄 수 있습니다 쉽게 객체를 매우 표시하는, Dump()를 통해 객체를 드릴 다운 할 수 있습니다 사용자 친화적 인. 작은 예제와 실험을 재현하십시오.

+1

많은 속성이있는 경우 원하지 않는 속성을 쉽게 추가 할 수 있습니다. 그러나 유형없이 속성을 어떻게 얻을 수 있습니까? 나는 그것을 발견 할 수 없었다. – Karsten

2

AllPropertiesExcept()이 반환하는 항목이 있습니까? 그렇지 않으면 (메소드 체인을 사용하여) 유창 인터페이스를 만들 수 :

var foo = AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3) 
    .DoSomeThing(); 
다음 AllPropertiesExcept() 방법은 뭔가를 반환하는 경우 당신은 메소드 체인의 끝에 메소드를 호출 할 때까지

AllPropertiesExcept(() => Property1) 
    .And(() => Property2) 
    .And(() => Property3); 

심지어, 당신은 실행을 연기 할 수

0

난 당신이 ModelMetadata 클래스는 여기에 문서화 이해하는 것입니다 필요 생각 : 이 클래스는 Html.LabelFor 같은 상황에서 ASP.NET MVC에서 사용되는 http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx

(X -> x.Name) 표현식은 여기에 설명 된 ModelMetadata.FromLambdaExpression 방법에 전달됩니다 http://msdn.microsoft.com/en-us/library/ee428393.aspx

이 MVC에서 어떻게 사용되는지 이해 한 후에는 다른 곳에서 적용된 방법에 대한 몇 가지 정보를 지식으로 자신의 코드를 만들 수 있습니다.