Come menzionato nei commenti, Expression<T>
è probabilmente il modo migliore per raggiungere questo obiettivo. Tuttavia, richiede un Compile()
in fase di esecuzione, quindi dovrebbe essere profilato prestazioni.
Con Expression<T>
si può facilmente ottenere l'accesso a informazioni metodo come questo:
public MethodInfo GetMethodInfo(Expression<Action> action)
{
return ((MethodCallExpression)action.Body).Method;
}
Ma, prima di eseguire l'azione è necessario farlo:
private void InvokeMethod(Expression<Action> action)
{
action.Compile().Invoke();
}
EDIT Ah sì, ho Ho dimenticato come ottenere l'accesso all'attributo del cliente. Si potrebbe fare così:
var methodInfo = ((MethodCallExpression)myAction.Body).Method;
var attributes = methodInfo.GetCustomAttributes<T>(true);
ESEMPIO Ecco un esempio che mostra il passaggio metodo incatenato chiama a Expression<Action>
:
public class ActionTest
{
public void DoAction(Action action)
{
action();
}
public void DoExpressionAction(Expression<Action> action)
{
var method2Info = ((MethodCallExpression)action.Body).Method;
// a little recursion needed here
var method1Info = ((MethodCallExpression)((MethodCallExpression)action.Body).Object).Method;
var myattributes2 = method2Info.GetCustomAttributes(typeof(MyAttribute), true);
var myattributes1 = method1Info.GetCustomAttributes(typeof(MyAttribute), true);
action.Compile().Invoke();
}
}
[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{
private string message;
public MyAttribute(string message)
{
this.message = message;
}
}
public class MethodTest
{
[MyAttribute("Number1")]
public MethodTest Method1()
{
Console.WriteLine("Action");
return this;
}
[MyAttribute("Number2")]
public MethodTest Method2()
{
Console.WriteLine("ExpressionAction");
return this;
}
}
class Program
{
static void Main(string[] args)
{
ActionTest target = new ActionTest();
MethodTest instance = new MethodTest();
target.DoExpressionAction(() => instance.Method1().Method2());
Console.ReadLine();
}
static void Method1()
{
Console.WriteLine("Action");
}
static void Method2()
{
Console.WriteLine("ExpressionAction");
}
}
fonte
2012-06-06 11:04:13
Ottima domanda. Non molto facilmente, AFAIK. Potresti * probabilmente * farlo abbastanza facilmente con un 'Expression', ma poi non puoi * direttamente * eseguirlo. –
Sono d'accordo che dovrai usare gli alberi di espressione per quello. Non so quanto danneggerà le prestazioni. –
Se non direttamente, come è possibile eseguirlo? – Joanna