2017-09-08 5 views
0

C#で式のNameValueを取得する簡単な方法を作成します。しかし、私は理解できないケースを見つけました。以下のコードを参照してください:x => x.propertyでContstantExpressionの名前と値を取得する方法

public void GetValue_Object_TIn_Property_Test() 
{ 
    string val = "value"; 
    var tuple = Tuple.Create(new object(), val); 
    Expression<Func<object, string>> expression = x => tuple.Item2; 

    Assert.AreEqual(val, expression.GetValue()); 
} 

.GetValue()の方法が私の拡張方法です。

基本的に、この表現樹は、LambdaExpression,2つのMemberExpressionsおよびConstantExpressionの順になります。

tuple.Item2の名前を取得しようとすると、最後にMemberExpressionからmemberExpression.Member.Nameが得られます。これは私に "Item2"の代わりに "タプル"を与えます。 "Item2"はどうすれば入手できますか?

また、式の値を取得しようとすると、Item2の代わりにタプル全体が取得されます。 MemberExpressionが再び最後MemberExpressionある

public override bool TryGetValue(
    MemberExpression memberExpression, 
    out T value 
) { 
    value = default(T); 
    bool success = false; 

    var fieldInfo = memberExpression.Member as FieldInfo; 
    if (success = (fieldInfo != null)) 
    { 
     var valueObj = fieldInfo.GetValue(expression.Value); 
     if (success = (valueObj is T || valueObj == null)) 
     { 
      value = (T)valueObj; 
     } 
    } 

    return success; 
} 

:私は値を取得するには、以下の方法を使用しています。 私はここで何が間違っていますか?紛失した正確なケースは何ですか?

は木がそのBody「アイテム2」のNametupleの値を取得するためFieldExpressionあるExpressionMemberフィールドを持つPropertyExpressionあるLambdaExpressionで、

+0

「ConstantExpression」が関係していると思われる理由はありませんか? – NetMage

答えて

0

実は事前にありがとう。 PropertyExpressionおよびFieldExpressionは、MemberExpressionを継承する内部型です。

Body.Expression.Member.Nameの代わりに(Body as MemberExpression).Member.Nameを取得する必要があります。 MemberExpressionとしてツリーの

考える(Memberを得る:Expressionからアイテム2:MemberExpressionMemberを得る:Expressionからタプル:周囲クラス]))。

LINQPadを使用しましたか?これはDump()コマンドでこれ以上のことが分かります。

+0

ありがとうNetMage!私は何かが欠けていると思った - 私は本当に何が分かっていない。私はLinqPadをすぐにダウンロードします - それを使ってからしばらく経ちました(あなたは知っています、 'それは一度..')。ありがとう!! –

関連する問題