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}

どんな助けでもいただければ幸いです!

4

1 に答える 1

5

私があなたの質問を正しく理解しているなら、AddOneメソッドにラムダ式を与えることによって、更新するプロパティを宣言できるようにしたいと思います。この場合、それは可能です-を取り、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();
    }
}
于 2011-01-26T16:31:17.983 に答える