私があなたの質問を正しく理解しているなら、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();
}
}