它不是特別漂亮/流利,但如果你真的想避免傳遞虛擬參數值,那麼你可以使用返回委託的表達式。
SetResolverMethod<ISomeInterface>(x => new Func<int, MyVarA>(x.GetNameById));
的SetResolverMethod
實施將是這個樣子:
public void SetResolverMethod<T>(Expression<Func<T, Delegate>> expr)
{
var unary = (UnaryExpression) expr.Body;
var methodCall = (MethodCallExpression) unary.Operand;
var constant = (ConstantExpression) methodCall.Arguments[2];
var method = (MethodInfo) constant.Value;
Console.WriteLine(method.Name);
}
編輯:如果你願意創建作爲一套重載每個Func<>
委託的,你可以通過包括提高流暢度方法參數類型在您的方法的通用參數類型中。
p.SetResolverMethod<ISomeInterface, int, MyVarA>(x => x.GetNameById);
如您所見,調用者不再需要指定委託類型,從而節省大約8個字符。
我實現了三個重載爲0,1和2個參數:
public void SetResolverMethod<T, TResult>(Expression<Func<T, Func<TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
public void SetResolverMethod<T, T1, TResult>(Expression<Func<T, Func<T1, TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
public void SetResolverMethod<T, T1, T2, TResult>(Expression<Func<T, Func<T1, T2, TResult>>> expr)
{
SetResolverMethod((LambdaExpression) expr);
}
private void SetResolverMethod(LambdaExpression expr)
{
var unary = (UnaryExpression) expr.Body;
var methodCall = (MethodCallExpression) unary.Operand;
var constant = (ConstantExpression) methodCall.Arguments[2];
var method = (MethodInfo) constant.Value;
Console.WriteLine(method.Name);
}
如果沒有標準的簽名,那麼你怎能稱呼呢?除非你強制作弊,否則會有一個標準的簽名(這將是可怕的)。 – colithium 2010-05-31 02:23:56
如果傳入的方法沒有標準簽名,那麼您希望在編譯時檢查什麼? – 2010-05-31 02:23:58
@colithium - 我從來沒有說過我想打電話給它。它是我需要的方法名稱。即我基本上想要MethodInfo。 – Rosstified 2010-05-31 02:28:38