Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取变量或参数的名称_C# - Fatal编程技术网

C# 获取变量或参数的名称

C# 获取变量或参数的名称,c#,C#,我想获取变量或参数的名称: public class TestClass { public void TestMethod(string param1, string param2) { string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1); } } 例如,如果我有: var myInput = "input"; var nameOfVar = GETNAME(my

我想获取变量或参数的名称:

public class TestClass
{
    public void TestMethod(string param1, string param2)
    {
        string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1);
    }
}
例如,如果我有:

var myInput = "input";

var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput

void testName([Type?] myInput)
{
   var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}

如何在C#中实现它?

您传递给
GETNAME
的是
myInput
值,而不是
myInput
本身的定义。唯一的方法是使用lambda表达式,例如:

var nameofVar = GETNAME(() => myInput);
确实有。然而!这散发着做错事的味道。我建议你重新思考你为什么需要这个。几乎可以肯定,这不是一种很好的方法,并且会带来各种开销(捕获类实例和表达式树)。此外,它还会影响编译器:如果没有这一点,编译器实际上可能会选择完全删除该变量(只使用堆栈而不使用正式的局部变量)。

C#6.0之前的解决方案 您可以使用此选项获取任何提供的成员的名称:

public static class MemberInfoGetting
{
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression)
    {
        MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
        return expressionBody.Member.Name;
    }
}
要获取参数的名称,请执行以下操作:

public class TestClass
{
    public void TestMethod(string param1, string param2)
    {
        string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1);
    }
}
C#6.0及更高版本解决方案 您可以对参数、变量和属性使用运算符:

string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);
或者

1) 不接触
System.Reflection
namespace

GETNAME(new { myInput });

public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;

    return myInput.ToString().TrimStart('{').TrimEnd('}').Split('=')[0].Trim();
}
您可以缓存属性值以进一步提高性能,因为属性名称在运行时不会更改


对于我的口味来说,表达方式会慢一些。要一次性获得参数名称和值,请参见

您的意思是,获取变量的
类型
,而不是名称检查此答案,这似乎有效:[[1]:@NeilKnight根据他的例子,我认为他实际上指的是变量的名称。我认为这在
VB
中是可能的。从未在
C.
中尝试过。但这是一种可怕的编程风格!我无法给出答案,因为这个问题被(错误地)解决了标记为重复。在C#6.0中,您可以使用:
var nameOfVar=nameof(myInput);//nameOfVar==“myInput”
我有一个参数列表。我想将这些值保存在文本文件中。我不想这样做:“abc=“+value=”但是:GETNAME(variable)+变量。这将更快、更优雅。@devn不,我绝对保证它不会更快。它将明显更慢-它需要创建一个捕获实例、创建一个表达式和解析一个表达式。不会更快。优雅是主观的。坦率地说,我不认为使用简单的
string.Formatstring.Format(“foo={0},bar={1}”,foo,bar)
,因为:在方法中,它们是一个实现细节,但在文件中它们是文档格式的一部分,与局部变量的调用无关。这对于处理变量名非常有用。在参数中获取名称如何?谢谢advance@devn我用一个示例代码编辑了我的答案,显示了如何使用相同的方法获取参数名称。这似乎对我不起作用…{“无法将类型为'System.Linq.Expressions.TypedConstantExpression'的对象强制转换为类型为'System.Linq.Expressions.MemberExpression'。”我的答案中的这两个示例对我很有用。请尝试发布一些重复错误的代码。此答案依赖于Microsoft C#编译器的非标准化行为,可能会在其他编译器或未来版本下崩溃。请参阅我的和。实际上,这给出了变量类型的名称。第一个示例是d!您可能已经重写了ToString()方法和boom!@cmxl这只适用于匿名类型,这是一种定制模型,仅用于获取成员名称(变量、字段等)。无论如何,今天应该始终使用
nameof()
operator只是想添加一个提示,因为该函数不限于匿名类型。
nameof()rocks\o/
GETNAME(new { variable });
public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}
new { myClass.MyProperty1 }.GETNAME();