2012-06-02 4 views
0

Я экспериментирую с выражениями (Microsoft.Scripting.Ast) и вам нужно назначить делегатскую переменную делегатом другому методу экземпляра, а затем вызвать этот делегат. К сожалению, я очень невежественны :(Использование Ast.Expressions для создания делегата

var @delegate = Expression.Variable (typeof (Delegate)); 
var expression = Expression.Block(
    new [] { @delegate }, 
    Expression.Assign(@delegate, /* MISSED PART */), 
    Expression.Call(@delegate, typeof(Delegate).GetMethod("DynamicInvoke")) 
); 

Пожалуйста, скажите мне, если я пропустил что-нибудь. Это для моего в последнее время начал интернатуру. Так что вполне возможно, что это не имеет никакого смысла ^^

+0

Ну вы 'не использовать результат метода Block, для начала ... –

+0

Извините, моя ошибка. _Btw, спасибо за вашу книгу. Это прямо рядом со мной;) _ – Matthias

+0

Вы действительно * используете Microsoft.Scripting. А вместо «нормальных» деревьев выражений (System.Linq.Expressions), btw? Если да, есть ли у вас какие-то особые причины для этого? (Рад, что вам нравится книга, кстати.) У меня нет опыта работы с Microsoft.Scripting.Ast, но если вы можете предоставить более полный пример того, что вы пытаетесь сделать, я поеду с Системой .Linq.Expressions ... –

ответ

0

ответ был Expression.GetDelegateType(...)

Вот фрагмент кода, который создает делегат для MethodInfo:

public static Type GetDelegateType (this MethodInfo methodInfo) 
{ 
    var parameterTypes = methodInfo.GetParameters().Select (x => x.ParameterType); 
    var returnType = new[] { methodInfo.ReturnType }; 

    var delegateTypes = parameterTypes.Concat (returnType).ToArray(); 
    return Expression.GetDelegateType (delegateTypes); 
} 
Смежные вопросы