que tienen una jerarquía de clases del padre/donde el padre declara en abstracto una propiedad de cadena y la clase del niño pone en práctica:¿Cómo hacer que el niño declare el tipo de una expresión?
abstract class Parent
{
public abstract string Value { get; }
}
class Child : Parent
{
public override string Value { get { return null; } }
}
Cuando utilizo una expresión que explícitamente (o implícitamente) utiliza la clase del niño, espero DeclaringType de MemberInfo de las expresiones a 'niño', sino que es Padre:
Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!
la afirmación falla porque el DeclaringType es Padre.
¿Hay algo que pueda hacer al declarar mi expresión o consumirla para revelar el uso real del tipo de niño?
NOTA: GetMemberInfo() anterior como un método de extensión:
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;
}
}
clase 'Child' no lo hace heredar de 'Parent'! – vulkanino
¿Qué es este método GetMemberInfo()? Si es una extensión, publique su implementación. – Ani
"Si el objeto Type del que se obtuvo este objeto MemberInfo no declaró este miembro, la propiedad DeclaringType representará uno de sus tipos base". – vulkanino