是否有可能在方法中轻松获取变量名及其值?
本文关键字:变量名 获取 有可能 方法 是否 | 更新日期: 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();
}