2011-01-26 148 views
1

我很新的C#Generic Classes所以我不知道我們是否可以動態更新泛型類的泛型屬性?更新泛型類的泛型屬性?

讓說我有一個類

A { long id; long count; } 

,我們可以寫一個1,以便

A.AddOne(a => a.id); will change A {id=1, count=1} to A {id=2, count=1} 

and 

A.AddOne(a => a.count); will change A {id=1, count=1} to A {id=1, count=2} 

任何幫助,將不勝感激更新指定屬性的延伸!

+1

以何種方式被這個類的通用? – LukeH 2011-01-26 16:29:03

回答

5

如果我正確理解您的問題,您希望能夠通過給AddOne方法指定一個lambda表達式來聲明要更新哪個屬性。在這種情況下,有可能 - 您可以編寫一個擴展方法,它採用Expression<T>,從此表達式中檢索屬性訪問表達式,並使用反射來更新A對象上的該屬性。

以下是上面的一個非常粗略的原型:

public static void AddOne<S,T>(this S x, Expression<Func<S,T>> expr) 
{ 
    if (expr.Body.NodeType != ExpressionType.MemberAccess) 
     throw new InvalidOperationException(); 

    MemberExpression memberExpr = expr.Body as MemberExpression; 
    switch (memberExpr.Member.MemberType) 
    { 
     case MemberTypes.Field: 
      { 
       FieldInfo field = memberExpr.Member as FieldInfo; 
       ulong value = Convert.ToUInt64(field.GetValue(x)); 
       ++value; 
       field.SetValue(x, Convert.ChangeType(value, field.FieldType)); 
       break; 
      } 
     case MemberTypes.Property: 
      { 
       PropertyInfo prop = memberExpr.Member as PropertyInfo; 
       ulong value = Convert.ToUInt64(prop.GetValue(x, null)); 
       ++value; 
       prop.SetValue(x, Convert.ChangeType(value, prop.PropertyType), null); 
       break; 
      } 
     default: 
      throw new InvalidOperationException(); 
    } 
}