在通过函数时,是否可以传递变量的名称和值?

时间:2009-07-06 12:52:44

标签: vb.net language-agnostic

我想知道是否可以从传递到某个函数时检索变量名称。例如,如果我将parseId(myId)调用到具有签名parseId(id)的函数,我显然可以检索'id'的值。但是,有什么方法可以将'myId'作为字符串检索(不将其作为另一个值传递)?

特别是在vb.net中,但我对它在任何给定语言中的工作方式感兴趣。

3 个答案:

答案 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 - 用你熟悉的语言写它很难......)