2012-07-04 89 views
0

我想轉換一個:將表達式轉換<Func鍵<TProperty>>到Func鍵<TObject的,TProperty> TObject的地方被稱爲

Expression<Func<TProperty>> 

Func<TObject, TProperty> 

凡TObject的是已知的,並公開由表達式表達的屬性。爲此,我想象必須操縱表達式,將它與新表達式中的TObject類型參數結合起來並進行編譯。

編輯:實施例的輸入和輸出

class SomeType 
{ 
    public int Number { get; set; } 

    public Func<TObject, TProperty> FuncConverter<TObject, TProperty>(Expression<Func<TProperty>>) 
    { 
     // ???  
    } 

    public void test() 
    { 
     Func<SomeType, int> outputFunc = FuncConverter<SomeType, int>(inputExpression); 
    } 
} 

表達我期望作爲輸入:

Expression<Func<int>> inputExpression =() => Number; 

該表達式指向Number屬性上SOMETYPE

函數求委託,我期望作爲輸出:

Func<SomeType, int> outputFunc = type => type.Number; 

End Edit

問題是,我不知道該怎麼做。我真的很感激一些(引用)操作Lambda表達式的可訪問信息,因爲我還沒有遇到任何問題。

+2

忽略錯字,我不知道我明白如何將不帶參數的函數轉換爲帶參數的函數。 – Jodrell

+1

'TObject已知並且暴露了表達式表達的屬性 - >這是我有很多麻煩理解的句子。你能澄清一下嗎? –

+0

@Jodrell Expression指向對象上的一個屬性。我假設,結合對象類型的知識,將有可能構建一個新的表達式,我可以將其用作集合的ToDictionary方法中的EqualityComparer。你說這是不可能的嗎? –

回答

0

我發現一個回答我的問題:

Func<TObject, TProp> Converter<TObject, TProp>(Expression<Func<TProp>> propertyExpression) 
    { 
     MemberExpression member = propertyExpression.Body as MemberExpression; 

     // Get the Property information of the propertyExpression memberExpression 
     var property = member.Member as PropertyInfo; 

     // Get the Declaring type information from member expression (equivalent to TObject) 
     var type = member.Member.DeclaringType; 

     // Define the source Parameter for the new Func delegate 
     var param = Expression.Parameter(type, "source"); 
     var source = Expression.Convert(param, type); 

     // Get the property on the source 
     var get = Expression.MakeMemberAccess(source, property); 
     var convert = Expression.Convert(get, typeof(TProp)); 

     // Construct the Expression 
     var lambda = Expression.Lambda<Func<TObject, TProp>>(convert, param); 

     // Compile to get the Func delegate type 
     return lambda.Compile(); 
    } 

我在這裏找到的信息:link

稍微適應它來解決我的問題。感謝所有評論者...

相關問題