Ho una gerarchia di classi padre/figlio dove il genitore dichiara astrattamente una proprietà di stringa e la classe bambino lo implementa:Come far dichiarare il tipo da un'espressione?
abstract class Parent
{
public abstract string Value { get; }
}
class Child : Parent
{
public override string Value { get { return null; } }
}
Quando uso un'espressione che esplicitamente (o implicitamente) utilizza la classe Bambino, mi aspetto DeclaringType le proprie espressioni di MemberInfo di essere 'Bambino', ma invece è principale:
Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!
l'asserzione non riesce perché la DeclaringType è Capogruppo.
C'è qualcosa che posso fare nel dichiarare la mia espressione o consumarla per rivelare l'uso effettivo del tipo Bambino?
NOTA: GetMemberInfo() di cui sopra come un metodo di estensione:
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;
}
}
classe 'Child' non lo fa eredita da 'Parent'! – vulkanino
Cos'è questo metodo GetMemberInfo()? Se si tratta di un'estensione, si prega di postarne l'implementazione. – Ani
"Se l'oggetto Type da cui è stato ottenuto questo oggetto MemberInfo non ha dichiarato questo membro, la proprietà DeclaringType rappresenterà uno dei suoi tipi base." – vulkanino