这是一个我无法回答的粗略问题.
主程序
class Program{
static void Main(string[] args){
Console.WriteLine("Begin");
var myClass = new MyClass();
Util.Print(myClass.Id);
Util.Print(myClass.Server);
Util.Print(myClass.Ping);
Console.WriteLine("End");
}
}
Run Code Online (Sandbox Code Playgroud)
如何实现Util.Print方法以将此输出提供给控制台:
Begin
Id
Server
Ping
End
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 14
假设您不想使用字符串,最常见的答案是通过Expression- 基本上模拟缺失infoof; 你必须使用类似的东西:
Console.WriteLine("Begin");
var myClass = new MyClass();
Util.Print(() => myClass.Id);
Util.Print(() => myClass.Server);
Util.Print(() => myClass.Ping);
Console.WriteLine("End");
Run Code Online (Sandbox Code Playgroud)
假设它们都是属性/字段(编辑添加的方法调用支持):
public static class Util
{
public static void Print<T>(Expression<Func<T>> expr)
{
WriteExpression(expr);
}
public static void Print(Expression<Action> expr) // for "void" methods
{
WriteExpression(expr);
}
private static void WriteExpression(Expression expr)
{
LambdaExpression lambda = (LambdaExpression)expr;
switch (lambda.Body.NodeType)
{
case ExpressionType.MemberAccess:
Console.WriteLine(((MemberExpression)lambda.Body)
.Member.Name);
break;
case ExpressionType.Call:
Console.WriteLine(((MethodCallExpression)lambda.Body)
.Method.Name);
break;
default:
throw new NotSupportedException();
}
}
}
Run Code Online (Sandbox Code Playgroud)