C# 是否可以轻松地获取方法中的变量名及其值

C# 是否可以轻松地获取方法中的变量名及其值,c#,asp.net,C#,Asp.net,跟着我 我有一个函数,它可以获取任意数量的变量,并且可以完美地工作 public string funcVars(params object[] paths) { string strVars = String.Join(", ", paths.Select(x => x.ToString())); return strVars; } 要说它,我只需要 string someString ="asd"; int someInt = 12

跟着我

我有一个函数,它可以获取任意数量的变量,并且可以完美地工作

 public string funcVars(params object[] paths)
    {
        string strVars = String.Join(", ", paths.Select(x => x.ToString()));

        return strVars;
    }
要说它,我只需要

string someString ="asd"; int someInt = 123; bool someBool=false;
funcVars(someString,someInt,someBool);
输出将是

asd,123,false
asd,123,false,someString,someInt,someBool //(or any other similar form)
是否有任何简单的方法可以获取变量名及其值,以便输出

asd,123,false
asd,123,false,someString,someInt,someBool //(or any other similar form)
还是每次调用方法时都需要硬编码名称

funcVars("someString","someInt","someBool",someString,someInt,someBool);

您真正应该做的是创建一个类来保存变量:

internal class MyValues
{
    internal string SomeString { get; set; }
    internal int SomeInt { get; set; }
    internal bool SomeBool { get; set; }
}
然后可以传递类的实例:

var mv = new MyValues() { SomeString = "asd", SomeInt = 123, SomeBool = false };
funcVars(mv);
这里是
funcVars

public string funcVars(MyValues values)
{
    string strVars = 
        String.Join(", ", new[] { values.SomeString, 
        values.SomeInt.ToString(), values.SomeBool.ToString() });

    return strVars;
}

您真正应该做的是创建一个类来保存变量:

internal class MyValues
{
    internal string SomeString { get; set; }
    internal int SomeInt { get; set; }
    internal bool SomeBool { get; set; }
}
然后可以传递类的实例:

var mv = new MyValues() { SomeString = "asd", SomeInt = 123, SomeBool = false };
funcVars(mv);
这里是
funcVars

public string funcVars(MyValues values)
{
    string strVars = 
        String.Join(", ", new[] { values.SomeString, 
        values.SomeInt.ToString(), values.SomeBool.ToString() });

    return strVars;
}

直接窃取roy.ap的代码并添加“nameof()”方法,因为获取属性的名称似乎是问题的一部分

class Program
{
    internal class MyValues
    {
        internal string SomeString { get; set; }
        internal int SomeInt { get; set; }
        internal bool SomeBool { get; set; }
    }

    static void Main(string[] args)
    {
        var mv = new MyValues() { SomeString = "asd", SomeInt = 123, SomeBool = false };
        Console.WriteLine(funcVars(mv));
        Console.ReadLine();
    }

    public static string funcVars(MyValues values)
    {
        string strVars =
            String.Join(", ", new[]
            {
                nameof(values.SomeString), values.SomeString,
                nameof(values.SomeInt), values.SomeInt.ToString(),
                nameof(values.SomeBool), values.SomeBool.ToString()
            });

        return strVars;
    }
}

实际上,没有办法通过函数本身获取变量名,因为一旦进入该方法,作用域就会发生变化。即使传递一个对象数组,如果执行foreach遍历每个对象,也会给各个对象一个新的特定于作用域的名称。

直接读取roy.ap的代码并添加“nameof()”方法,因为获取属性名称似乎是问题的一部分

class Program
{
    internal class MyValues
    {
        internal string SomeString { get; set; }
        internal int SomeInt { get; set; }
        internal bool SomeBool { get; set; }
    }

    static void Main(string[] args)
    {
        var mv = new MyValues() { SomeString = "asd", SomeInt = 123, SomeBool = false };
        Console.WriteLine(funcVars(mv));
        Console.ReadLine();
    }

    public static string funcVars(MyValues values)
    {
        string strVars =
            String.Join(", ", new[]
            {
                nameof(values.SomeString), values.SomeString,
                nameof(values.SomeInt), values.SomeInt.ToString(),
                nameof(values.SomeBool), values.SomeBool.ToString()
            });

        return strVars;
    }
}
实际上,没有办法通过函数本身获取变量名,因为一旦进入该方法,作用域就会发生变化。即使传递一个对象数组,如果执行foreach遍历每个对象,也会为各个对象指定一个新的范围特定名称。

否,因为变量实际上没有传递 不,这是不可能的,因为变量本身实际上并没有被传递。它们的值被传递

考虑以下代码:

string someString ="asd"; int someInt = 123; bool someBool=false;
funcVars(someString,someInt,someBool);
在对
funcVars
的调用中,所有参数均为。所有三个变量都被复制,并将它们的副本放在堆栈上。这些堆栈变量由完全不同的符号标识——(例如,
路径[0]
路径[1]
,等等)

毕竟,如果你这样称呼它会发生什么

funcVars("Hello",245+25,test != null);
显然,这些值没有变量名。函数无法检索不存在的内容

改用ExpandoObject 这个似乎非常适合解决这个问题

var args = new System.Dynamic.ExpandoObject();
args.SomeString = "hello";
args.SomeInt = 32;
args.SomeBool = false;
funcVars(args);

public static string funcVars(ExpandoObject inputs)
{
    var sb = new StringBuilder();
    foreach (KeyValuePair<string, object> kvp in inputs)      
    {
        sb.Append(String.Format("{0} = {1}", kvp.Key, kvp.Value);
    }
    return sb.ToString();
}
var args=new System.Dynamic.ExpandoObject();
args.SomeString=“你好”;
args.SomeInt=32;
args.SomeBool=false;
funcVars(args);
公共静态字符串functvars(expandooobject输入)
{
var sb=新的StringBuilder();
foreach(输入中的KeyValuePair kvp)
{
sb.Append(String.Format(“{0}={1}”),kvp.Key,kvp.Value);
}
使某人返回字符串();
}
否,因为变量没有实际传递 不,这是不可能的,因为变量本身并没有实际传递。它们的值是传递的

考虑以下代码:

string someString ="asd"; int someInt = 123; bool someBool=false;
funcVars(someString,someInt,someBool);
在对
funcVars
的调用中,所有参数都是。所有三个变量都被复制,并将它们的副本放在堆栈上。这些堆栈变量由完全不同的符号标识--(例如
路径[0]
路径[1]
等)

毕竟,如果你这样称呼它会发生什么

funcVars("Hello",245+25,test != null);
显然,这些值没有变量名。函数无法检索不存在的值

改用ExpandoObject 这个似乎非常适合解决这个问题

var args = new System.Dynamic.ExpandoObject();
args.SomeString = "hello";
args.SomeInt = 32;
args.SomeBool = false;
funcVars(args);

public static string funcVars(ExpandoObject inputs)
{
    var sb = new StringBuilder();
    foreach (KeyValuePair<string, object> kvp in inputs)      
    {
        sb.Append(String.Format("{0} = {1}", kvp.Key, kvp.Value);
    }
    return sb.ToString();
}
var args=new System.Dynamic.ExpandoObject();
args.SomeString=“你好”;
args.SomeInt=32;
args.SomeBool=false;
funcVars(args);
公共静态字符串functvars(expandooobject输入)
{
var sb=新的StringBuilder();
foreach(输入中的KeyValuePair kvp)
{
sb.Append(String.Format(“{0}={1}”),kvp.Key,kvp.Value);
}
使某人返回字符串();
}

duplciate摘要:如果确实需要,则需要传入
字典
来保存变量名,而不是使用
params object[]
@ScottChamberlain我不认为这是一个重复。变量的名称不需要;OP只需要能够识别
funcVars
方法中的哪个是哪个。在这里使用对象字典是不可取的,也不符合OO的精神。值不是强类型的,将被装箱.我建议改为创建一个类。我有点犹豫了,在这方面。它对我来说确实像一个复制品,但我会重新打开它,因为我真的不喜欢有一个金色C#徽章的能力让我只需一票就可以结束。链接到我标记为复制品的原始问题:你可以在Sy中使用StackTrace和StackFrame类stem.Diagnostics命名空间来确定方法参数的名称。第0帧是当前正在执行的方法。删除我的答案,在这种特定情况下它将不起作用。它将生成的只是路径参数的名称。Duplicate摘要:如果确实需要,则需要将
字典
传递给保留变量名,而不是使用
params object[]
@ScottChamberlain我不认为这是一个重复。变量的名称不需要;OP只需要能够识别
funcVars
方法中的哪个是哪个。在这里使用对象字典是不可取的,也不符合OO的精神。值不是强类型的,将被装箱.我建议改为创建一个类。我有点犹豫了,在这方面。它对我来说确实像一个复制品,但我会重新打开它,因为我真的不喜欢有一个金色C#徽章的能力让我只需一票就可以结束。链接到我标记为复制品的原始问题:你可以在Sy中使用StackTrace和StackFrame类诊断命名空间来确定方法参数的名称