2012-06-07 4 views
2

Я искал поисковый запрос, а также искал SO. Существует множество решений, которые все из них (которые я нашел) не завершены. Можете ли вы мне помочь, чтобы установить свойства класса и свойства его вложенного свойства, выбранные lambda, используя Reflection?Как установить свойства и свойства вложенного свойства с помощью выражения

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

и потребитель, я хочу быть в состоянии:

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

Почему конкретно выражения? Будет ли 't.Set (« Number », 6)' и 't.Set (« Nested.Id », 25)' достаточно? Это, вероятно, проще, и я могу придумать интересные способы сделать это. –

+0

Его ОК. Я могу найти имя участников (через. (Точка) между ними). Можете ли вы предложить свое решение, пожалуйста? –

+0

, прежде чем я это сделаю ... в чем причина, почему вы не можете просто использовать прямой C#? то есть 't.Number = 6; t.Name = "something"; 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

спасибо, а также этот набор значений вложенных свойств тоже? Я проверю его –

Смежные вопросы