围绕C#lambda表达式的包装器

时间:2013-12-11 16:53:18

标签: c# dll com lambda wrapper

背景:

我正在创建一个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);

这是相当直接的。

我要做的是在它周围创建一个包装器,这样我就可以传递任何对象而不是在参数中使用lambda表达式。

因此,我只想传递() => testVariable

而不是object

我试图像这样包装它

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

但它返回objInstance而不是我传递给函数的对象。

我尝试使用(原谅我)一个ref关键字,但它不适用于lambda表达式。

如果有人能够首先验证我正在尝试的是否可能那就太棒了!如果是,那么请指导我或指向有关为lambda表达式编写包装函数的参考。

您的时间和帮助非常感谢!

1 个答案:

答案 0 :(得分:4)

如果传入实际表达式而不是表示它的Expression对象,则表达式在传递给函数之前将被计算为其值。当你进入函数时,访问该信息为时已晚。使用Expression传递用于表示该表达式的所有信息,而不仅仅是其值,这就是您可以从该函数内部访问它的原因。