我有一個父/子類層次結構中的父抽象聲明一個字符串屬性和子類實現它:如何讓孩子從表達式中聲明類型?
abstract class Parent
{
public abstract string Value { get; }
}
class Child : Parent
{
public override string Value { get { return null; } }
}
當我使用顯式(或隱式)使用兒童類的表情,我期待表達的的MemberInfo的DeclaringType是「孩子」,而是它是父:
Child child = new Child();
Expression<Func<string>> expression = (() => child.Value);
MemberInfo memberInfo = expression.GetMemberInfo();
Assert.AreEqual(typeof(Child), memberInfo.DeclaringType); // FAILS!
因爲DeclaringType是家長斷言失敗。
有什麼我可以做聲明我的表達或消耗它來揭示兒童類型的實際使用?
注: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;
}
}
類'Child'不從'Parent'繼承! – vulkanino 2012-02-27 14:25:11
什麼是GetMemberInfo()方法?如果是擴展名,請發佈其實施。 – Ani 2012-02-27 14:27:38
「如果從中獲取此MemberInfo對象的Type對象未聲明此成員,則DeclaringType屬性將表示其基本類型之一。」 – vulkanino 2012-02-27 14:29:23