是否有可能在方法中轻松获取变量名及其值?

本文关键字:变量名 获取 有可能 方法 是否 | 更新日期: 2023-09-27 18:17:57

下面是我是否有可能有一个函数,采取任何类型的任何数量的变量?

我有一个函数可以获取任意数量的任意类型的变量它运行得很好

 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)

或者我需要在每次调用方法时硬编码这些名称吗?

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;
}

直接偷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的调用中,所有参数都是按值传递的。所有三个变量都被复制,它们的副本被放在堆栈上。这些堆栈变量由完全不同的符号标识——(例如paths[0], paths[1]等)

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

funcVars("Hello",245+25,test != null);

显然这些值没有变量名。你的函数不可能检索到不存在的东西。

使用ExpandoObject代替

System.Dynamic.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();
}