2013-12-11 2 views
1

фона:обертка вокруг лямбда-выражения C#

Я создаю библиотеку COM, и хотел бы использовать модифицированную версию кода из this answer. Я хотел бы передать объект в функцию WhatsMyName COM и вернуть представление string. Я не совсем уверен, что это еще возможно, но пытается не повредит;)

Это, как я вижу это:

Dim myComInst as new MyComLib 
MsgBox myComInst.WhatsMyName(myComInst) 

и ожидая myComInst быть возвращены.


Я застрял в завершении функции ниже, поэтому он не принимает выражение, а параметр объекта.

public static class MemberInfoGetting 
{ 
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression) 
    { 
     MemberExpression expressionBody = (MemberExpression)memberExpression.Body; 
     return expressionBody.Member.Name; 
    } 
} 

И я могу использовать его как этот

string testVariable = "value"; 
string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => testVariable); 

, который является довольно прямо вперед.

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

Итак, вместо () => testVariable Я хотел бы передать только object.

Я попытался обернуть его как этот

public string WhatsMyName(object objInstance) 
{ 
    return MemberInfoGetting.GetMemberName(() => objInstance);   
} 

но он возвращает objInstance вместо объекта я передаю в функцию.

Я пытался использовать (простите меня) a ref ключевое слово, но оно не работает с лямбда-выражениями.

Если кто-то может сначала проверить, возможно ли то, что я пытаюсь, или нет, это было бы здорово! Если это так, то, пожалуйста, направляйте меня или указывайте на ссылки о написании функции-обертки для выражения лямбда.

Ваше время и помощь высоко оценены!

+2

Это абсолютно невозможно. Сожалею. – SLaks

+0

@SLaks благодарит, вы не возражаете, объясняя, что на самом деле невозможно? общая идея или способ, которым я пытаюсь заменить лямбда-выражение? –

+1

Вам нужно всегда передать дерево выражений. – SLaks

ответ

4

Если вы передадите фактическое выражение, а не объект Expression, который представляет его, тогда выражение оценивается до его значения до его передачи в функцию. К тому времени, когда вы находитесь внутри функции, слишком поздно для доступа к этой информации. Использование Expression передает всю информацию, используемую для представления этого выражения, а не только его значение, поэтому вы можете получить доступ к ней изнутри этой функции.

+0

@mehow VB.NET поддерживает его; Я не думаю, что VBA делает, хотя я не уверен. – Servy

+0

право, спасибо @Servy –

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