我是C#Generic Classes
的新手,所以我不知道我们是否可以动态更新泛型类的泛型属性?
假设我有一个班级
A { long id; long count; }
我们可以写一个更新给定属性的扩展名,所以
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}
任何帮助都将不胜感激!
答案 0 :(得分:5)
如果我正确理解了您的问题,您希望能够通过为AddOne
方法提供lambda表达式来声明要更新的属性。在这种情况下,可以 - 您可以编写一个带有Expression<T>
的扩展方法,从该表达式中检索属性访问表达式,并使用Reflection更新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();
}
}