2011-01-26 127 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(); 
    } 
}