我有一個LambdaExpression
,它是Expression<Func<T, string>>
類型。代碼的設計目前不允許我繼續T
這意味着我不得不使用較慢的DynamicInvoke
,而不是Invoke
。將表達式<Func<T, U>>轉換爲表達式<Func <object,object >>
因爲我知道T
的類型,所以我想將表達式轉換爲它接受T
對象,允許我使用Invoke
。怎麼樣?
這裏有一個良好的開端
class Program
{
class MyClass
{
public string MyProperty => "Foo";
}
static LambdaExpression GetExpression(Expression<Func<MyClass, object>> expr)
{
return expr;
}
static void Main(string[] args)
{
var e1 = GetExpression(t => t.MyProperty);
var e2 = Expression.Lambda<Func<object, object>>(e1, e1.Parameters);
object myClass = new MyClass();
string s1 = (string)e1.Compile().DynamicInvoke(myClass);
object s2 = e2.Compile().Invoke(myClass);
}
}
你的問題不符合您的標題。您是否想要轉換'Func鍵'來'Func鍵<對象,對象>'轉換'Func鍵'來'Func鍵<對象,對象>',或轉換'表達>'來'表達'?這三個人都有不同的答案。 –
hvd
我可以編寫一些代碼來解決這個問題...只有一個問題...你想使用這些表達式實體框架/ LINQ to SQL,或者你想簡單地編譯這些表達式嗎?因爲改變'Expression'使它們成爲'Func
更新了問題。最後,我想編譯表達式以用作類型化委託,以便我可以使用Invoke()而不是DynamicInvoke()。我相信'Expression.Convert'是需要某種方式。 – l33t