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类诊断命名空间来确定方法参数的名称