2016-05-08 33 views
-1

我希望能夠調用這個方法是這樣的:C#通用方法:如何聲明這種類型?

test.TestMethod<From, To>(to => to.Prop1); 

,並從要擁有IDE自動完成特性。在TestMethod中,我想提取該屬性的名稱。在這種情況下,Prop1。這似乎是它的工作,但我不知道Expression<Func<TTo, object>>,特別是對象部分。

public class Test 
{ 
    public void TestMethod<TFrom, TTo>(Expression<Func<TTo, object>> p) 
    { 
    } 
} 

它做什麼它應該現在如果我到p遞歸,我能得到這個名字,但它不看我的權利,特別是因爲拉道具的名字看起來像:

((MemberExpression)((UnaryExpression)(((LambdaExpression)p).Body)).Operand)).Member.Name 

任何方式來做這種清潔劑?

+1

也許這樣的事情會有用嗎? http://stackoverflow.com/questions/31261955/nameof-expression-in-net-framework-4/31262225#31262225 – Rob

+0

「我想(...)有IDE自動完成屬性」 - 因爲這是相當IDE特定的,你應該爲IDE添加適當的標籤(也許Visual Studio?或SharpDevelop?或MonoDevelop?)到你的問題。 –

+0

@Rob - 嗯......只適用於「this」。不在TTo上。方法需要強制輸入到TTo。 – SledgeHammer

回答

0

這裏是一個輔助類,將檢查的表達和提取財產

using System.Linq.Expressions; 
using System.Reflection; 

/// <summary> 
/// Extension for <see cref="Expression"/>. 
/// </summary> 
public static class ExpressionExtensions { 
    /// <summary> 
    /// Converts an expression into a <see cref="System.Reflection.MemberInfo"/>. 
    /// </summary> 
    /// <param name="expression">The expression to convert.</param> 
    /// <returns>The member info.</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; 
    } 

} 

與該成員的信息,那麼你可以提取名稱,意...

public class Test { 
    public void TestMethod<TFrom, TTo>(Expression<Func<TTo>> property) { 
     var memberName = property.GetMemberInfo().Name; 
     //...other code 
    } 
} 

你然後就可以像這樣調用這種方法...

test.TestMethod<From, To>(to => to.Prop1); 

...並獲取屬性名稱。