2015-12-17 1 views
0

У меня есть следующие функции:C# - Как изменить Func <T> аргументов

protected static T WrapException<T>(Func<T> function) 
{ 
    T result = default(T); 

    WrapException(delegate 
    { 
     result = function(); 
    }); 
    return result; 
} 

Я использую эту функцию во всех моих WCF сервисов проекта конечной точки:

public List<ResultDTO> GetSomething(SessionDto sessionDto) 
{ 
    return WrapException(() => _someFacade.Get(sessionDto)); 
} 

что мне нужно изменить значение sessionDto в WrapException перед вызовом action.

Я пытался получить к нему доступ, сделав следующий бросок:

((dynamic)function.Target) 

enter image description here

это работает отлично, но когда я пытаюсь получить доступ аргументы, он вызывает исключение.

enter image description here

Что я делаю неправильно?

Obs: извините мой английский, а не мой родной язык

+0

Если вы изменили свой язык Windows на английский, прежде чем снимать скриншоты, сообщения об ошибках должны быть на английском языке. Это очень поможет другим людям на этом сайте помочь вам. –

+1

В какой момент вы хотите получить доступ/изменить 'sessionDto'? – khlr

+0

Меняет WrapException на 'T WrapException (выражение > функция)' будет приемлемым? это делает проблему намного проще. –

ответ

2

Ответ на ваш вопрос, это невозможно сделать это безопасным способом.

Вы можете попытаться отредактировать sessionDto в объекте Target. Это автоматически сгенерированное поле лямбда-закрытия. Эта структура не документирована. Это может измениться в любое время.

Даже если вы заработаете, это плохая архитектура, потому что вы достигаете внутренних частей другого кода.

Возможно, вам необходимо реорганизовать свой код, чтобы не было необходимости редактировать локальные переменные другой функции (!).

+0

проблема в том, что я не могу изменить sessionDto в Target, когда я пытаюсь это сделать, он выбросил exesption в последний скриншот моего вопроса. «Объект» не содержит «sessionDto» –

+0

Вы не можете использовать динамический доступ к закрытым членам. Используйте Reflection. – usr

+0

Я сделал это, посмотрю на вопросы скриншот –

Смежные вопросы