您可能想尝试以下方法(警告 => C#):
class Program
{
static void Main(string[] args)
{
test(1, "one");
test(2, "two");
test(3, "three");
Console.ReadLine();
}
private static void test(int x, string y)
{
DisplayParameterNameAndValue(() => x);
DisplayParameterNameAndValue(() => y);
}
static void DisplayParameterNameAndValue(Expression<Func<object>> parameter)
{
var expressionBody = parameter.Body;
MemberExpression memberExpression;
if (expressionBody is UnaryExpression)
{
memberExpression = (MemberExpression)((UnaryExpression)expressionBody).Operand;
}
else if (expressionBody is MemberExpression)
{
memberExpression = (MemberExpression)expressionBody;
}
else
{
throw new ArgumentException("parameter");
}
string parameterName = memberExpression.Member.Name;
object parameterValue = parameter.Compile().Invoke();
Console.WriteLine("{0} => {1}", parameterName, parameterValue);
}
}
VB 中的等效代码为:
Module Module1
Sub Main()
test(1, "one")
test(2, "two")
test(3, "three")
Console.ReadLine()
End Sub
Private Sub test(ByVal x As Integer, ByVal y As String)
DisplayParameterNameAndValue(Function() x)
DisplayParameterNameAndValue(Function() y)
End Sub
Private Sub DisplayParameterNameAndValue(ByVal parameter As Expression(Of Func(Of Object)))
Dim expressionBody = parameter.Body
Dim memberExpression As MemberExpression
If TypeOf expressionBody Is UnaryExpression Then
memberExpression = DirectCast(DirectCast(expressionBody, UnaryExpression).Operand, MemberExpression)
ElseIf TypeOf expressionBody Is MemberExpression Then
memberExpression = DirectCast(expressionBody, MemberExpression)
Else
Throw New ArgumentException("parameter")
End If
Dim parameterName As String = memberExpression.Member.Name
Dim parameterValue As Object = parameter.Compile().Invoke()
Console.WriteLine("{0} => {1}", parameterName, parameterValue)
End Sub
End Module
我已经对其进行了测试,但它并没有给我与 c# 相同的结果,糟糕的 vb!
希望这可以帮助。