Я пытаюсь узнать о выражении дерев, и я создал метод, который принимаетДоступа вызывающий объект из MethodCallExpression
Expression<Func<bool>>
и выполняет его, если он удовлетворяет некоторые условия - см код ниже.
private static void TryCommand(Expression<Func<bool>> expression)
{
var methodCallExpression = expression.Body as MethodCallExpression;
if (methodCallExpression == null)
{
throw new ArgumentException("expression must be a MethodCallExpression.");
}
if (methodCallExpression.Object.Type != typeof (MyClass))
{
throw new ArgumentException("expression must be operating on an instanceof MyClass.");
}
var func = expression.Compile();
var success = func.Invoke();
if(!success)
{
Console.WriteLine(methodCallExpression.Method.Name + "() failed with error code " + (func.Target as MyClass).GetError());
}
}
Проблема,
(func.Target as MyClass)
равна нулю. Ясно, что я делаю что-то неправильно! Как получить доступ к экземпляру, на котором работает данный метод?
Джон, я работаю с третьей стороной "MyClass" (извините, плохо именование на моем part!), поэтому я не могу изменить его на Func [int]. Я рассмотрю ваше первое предложение. Я согласен, что это не кажется чистым, но в основном я просто узнаю о том, что возможно. Спасибо за предложения! – Akash 2008-12-04 13:40:30
Как вы вызываете TryCommand? У вас есть контроль над этим? Вы можете написать метод-обертку, который принимает Func и MyClass, а затем вызывает делегата и при необходимости проверяет код ошибки. –
2008-12-04 14:04:28