2012-06-07 3 views
2

나는 푯말을 봤는데 그래서 검색. 내가 찾은 모든 솔루션이 완료되지 않은 수많은 솔루션이 있습니다. 에 의해 선택되는 클래스의 속성과 중첩 된 속성의 속성을 설정하려면 Reflection을 사용하여 제발 나를 도울 수 있습니까? 이 같은표현식을 사용하여 속성 및 중첩 된 속성의 속성을 설정하는 방법

Parent t = new Parent(); 
t.Set<int>(t => t.Number, 6) 
.set<string>(t => t.Name, "something") 
.Set<int>(t => t.Nested.Id, 25); 
+0

왜 구체적으로 표현

public class Parent { public class Child { public int Id { get; set; } } public string Name { get; private set; } public int Number {get; private set; } public Child Nested { get; set; } public Parent() { Nested = new Child(); } public Test Set<TValue>(Expression<Func<???> func, TValue value) { // find the property name from expression // set the property by value return this; } } 

및 소비자의

, 내가 할 수있을까요? ''t.Set ("Number", 6)''t.Set ("Nested.Id", 25)'충분합니까? 그것은 아마 더 쉬울 것이고, 나는 그것을 할 몇 가지 흥미로운 방법을 생각해 낼 수 있습니다. –

+0

OK입니다. 회원 이름을 찾을 수 있습니다 (. (점) 사이). 당신의 솔루션을 제발 제안 해 주시겠습니까? 전에 –

+0

... 직접 C#을 사용할 수없는 이유는 무엇입니까? 즉't.Number = 6; t.Name = "무언가"; t.Nested.Id = 25; ' –

답변

4

뭔가 작동합니다 :

public class Parent 
{ 
    public Parent Set<TValue>(Expression<Func<Parent, TValue>> func, TValue value) 
    { 
     MemberExpression mex = func.Body as MemberExpression; 
     if(mex == null) throw new ArgumentException(); 

     var pi = mex.Member as PropertyInfo; 
     if(pi == null) throw new ArgumentException(); 

     object target = GetTarget(mex.Expression); 
     pi.SetValue(target, value, null); 
     return this; 
    } 

    private object GetTarget(Expression expr) 
    { 
     switch (expr.NodeType) 
     { 
      case ExpressionType.Parameter: 
       return this; 
      case ExpressionType.MemberAccess: 
       MemberExpression mex = (MemberExpression)expr; 
       PropertyInfo pi = mex.Member as PropertyInfo; 
       if(pi == null) throw new ArgumentException(); 
       object target = GetTarget(mex.Expression); 
       return pi.GetValue(target, null); 
      default: 
       throw new InvalidOperationException(); 
     } 
    } 
} 
+0

속성을 설정하고 싶습니다. 서명뿐만 아니라 –

+0

@ king.net - 답변을 업데이트했습니다. – Lee

+0

감사합니다.이 중첩 된 속성 값도 설정합니까? 나는 그것을 시험 할 것이다 –

관련 문제