背景:
我正在创建一个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表达式编写包装函数的参考。
您的时间和帮助非常感谢!
答案 0 :(得分:4)
如果传入实际表达式而不是表示它的Expression
对象,则表达式在传递给函数之前将被计算为其值。当你进入函数时,访问该信息为时已晚。使用Expression
传递用于表示该表达式的所有信息,而不仅仅是其值,这就是您可以从该函数内部访问它的原因。