Как получить дочерний тип, объявляющий тип из выражения?

У меня есть иерархия родительских / дочерних классов, в которой родительский / дочерний класс абстрактно объявляет строковое свойство, а дочерний класс реализует его:

abstract class Parent
{
   public abstract string Value { get; }
}

class Child : Parent
{
   public override string Value { get { return null; } }
}

Когда я использую выражение, которое явно (или неявно) использует дочерний класс, я ожидайте, что DeclaringType MemberInfo выражений будет 'Child', но вместо этого это Parent:

Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!

Утверждение не выполняется, потому что DeclaringType имеет значение Parent.

Могу ли я что-то сделать, объявив свое выражение или используя его, чтобы выявить фактическое использование типа Child?

ПРИМЕЧАНИЕ: GetMemberInfo () выше в качестве метода расширения (я даже забыл, что мы написали это!):

public static class TypeExtensions
{
    /// <summary>
    /// Gets the member info represented by an expression.
    /// </summary>
    /// <param name="expression">The member expression.</param>
    /// <returns>The member info represeted by the expression.</returns>
    public static MemberInfo GetMemberInfo(this Expression expression)
    {
        var lambda = (LambdaExpression)expression;

        MemberExpression memberExpression;
        if (lambda.Body is UnaryExpression)
        {
            var unaryExpression = (UnaryExpression)lambda.Body;
            memberExpression = (MemberExpression)unaryExpression.Operand;
        }
        else memberExpression = (MemberExpression)lambda.Body;

        return memberExpression.Member;
    }
}
13
задан Gilles 'SO- stop being evil' 25 March 2012 в 16:16
поделиться