我想知道是否可以从传递到某个函数时检索变量名称。例如,如果我将parseId(myId)
调用到具有签名parseId(id)
的函数,我显然可以检索'id'的值。但是,有什么方法可以将'myId'作为字符串检索(不将其作为另一个值传递)?
特别是在vb.net中,但我对它在任何给定语言中的工作方式感兴趣。
答案 0 :(得分:1)
不,你不能在正常意义上做到这一点。你真的想用这个来完成什么?
答案 1 :(得分:1)
您可以使用表达式树在.NET 3.5及更高版本中执行此操作;我将敲一个C#示例,并尝试通过VB的反射器运行它......
C#:
static void Main()
{
int i = 17;
WriteLine(() => i);
}
static void WriteLine<T>(Expression<Func<T>> expression)
{
string name;
switch (expression.Body.NodeType)
{
case ExpressionType.MemberAccess:
name = ((MemberExpression)expression.Body).Member.Name;
break;
default:
throw new NotSupportedException("Give me a chance!");
}
T val = expression.Compile()();
Console.WriteLine(name + "=" + val);
}
VB在下面,但请注意VB编译器似乎使用不同的名称(如$VB$Local_i
,而不是i
):
Sub Main()
Dim i As Integer = 17
WriteLine(Function() i)
End Sub
Private Sub WriteLine(Of T)(ByVal expression As Expression(Of Func(Of T)))
If (expression.Body.NodeType <> ExpressionType.MemberAccess) Then
Throw New NotSupportedException("Give me a chance!")
End If
Console.WriteLine((DirectCast(expression.Body, MemberExpression).Member.Name
& "=" & Convert.ToString(expression.Compile.Invoke)))
End Sub
答案 2 :(得分:1)
这只是随意的想法..随意解散或不解释;-p
关于使用存储过程的评论...如果你想走这条路,我就不会乱用局部变量名;这是一个实现细节。但是,您可以在接口方法上公开这些详细信息并使用其中的名称,因为这更加形式化 - 例如(C#):
interface ICustomerRepository {
Customer GetById(int id); // perhaps an attribute to name the sproc
}
您可以使用类似的表达式树解析(as discussed here)来获取参数的名称和值,例如:
var repoWrapper = new Repo<ICustomerRepository>();
int custId = 12345;
var cust = repoWrapper.Execute(r => r.GetById(custId));
在这里,我们要将GetById
的参数解析为“id
”(不是“custId
”),值为12345
。这实际上就是我的protobuf-net RPC code所做的事情;-p(只是不要让我把它翻译成VB - 用你熟悉的语言写它很难......)