更新泛型类的泛型属性?

Byu*_*eng 1 c# generics dynamic propertychanged

我在C#上很新,Generic Classes所以我不知道我们是否可以动态更新泛型类的泛型属性?

假设我有一堂课

A { long id; long count; }
Run Code Online (Sandbox Code Playgroud)

我们可以编写一个扩展,将给定属性更新为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}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Sas*_*ein 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();
    }
}
Run Code Online (Sandbox Code Playgroud)