gpt4 book ai didi

c# - 如何枚举传递的方法参数

转载 作者:可可西里 更新时间:2023-11-01 08:44:44 26 4
gpt4 key购买 nike

可以这样枚举被调用方法的参数类型/信息:

private void SomeMethod(int thisValue, string thatValue)
{
StackTrace stackTrace = new StackTrace();
foreach (ParameterInfo pInfo in stackTrace.GetFrame(0).GetMethod().GetParameters())
{
string name = pInfo.Name;
string type = pInfo.GetType().ToString();
}
}

但是有什么办法可以得到每个参数的实际对象呢?

编辑:我的目标是枚举所有参数并获取它们的值。使用 LinQ 表达式,可以像这样获取参数值:

private void SomeMethod(int thisValue, string thatValue)
{
object valueOfThis = GetParameterValue(() => thisValue);
object valueOfThat = GetParameterValue(() => thatValue);
}
private object GetParameterValue<T>(Expression<Func<T>> expr)
{
var body = ((MemberExpression)expr.Body);
return ((FieldInfo)body.Member).GetValue(((ConstantExpression)body.Expression).Value);
}

但我想做的是:

foreach (fooObject o in thisMethod.GetParameterObjects())
{
object someValue = GetParameterValue(() => fooObject);
}

因此有一个通用方法来收集所有参数及其值。

最佳答案

更新:

看起来我试图解释所有内容,从而使最初的答案“过于复杂”。这是答案的简短版本。

private static void SomeMethod(int thisValue, string thatValue)  
{
IEnumerable<object> parameters = GetParameters(() => SomeMethod(thisValue, thatValue));
foreach (var p in parameters)
Console.WriteLine(p);
}
private static IEnumerable<object> GetParameters(Expression<Action> expr)
{
var body = (MethodCallExpression)expr.Body;
foreach (MemberExpression a in body.Arguments)
{
var test = ((FieldInfo)a.Member).GetValue(((ConstantExpression)a.Expression).Value);
yield return test;
}
}

这是带有一些解释的长版本。

事实上,如果使用表达式树,则无需在方法内部枚举其参数。

    static void Main(string[] args)
{

// First approach.
IEnumerable<object> parameters = GetParametersFromConstants(() => SomeMethod(0, "zero"));
foreach (var p in parameters)
Console.WriteLine(p);

// Second approach.
int thisValue = 0;
string thatValue = "zero";
IEnumerable<object> parameters2 = GetParametersFromVariables(() => SomeMethod(thisValue, thatValue));
foreach (var p in parameters2)
Console.WriteLine(p);

Console.ReadLine();
}

private static void SomeMethod(int thisValue, string thatValue)
{
Console.WriteLine(thisValue + " " + thatValue);
}

private static IEnumerable<object> GetParametersFromVariables(Expression<Action> expr)
{
var body = (MethodCallExpression)expr.Body;
foreach (MemberExpression a in body.Arguments)
{
var test = ((FieldInfo)a.Member).GetValue(((ConstantExpression)a.Expression).Value);
yield return test;
}
}

private static IEnumerable<object> GetParametersFromConstants(Expression<Action> expr)
{
var body = (MethodCallExpression)expr.Body;
foreach (ConstantExpression a in body.Arguments)
{
var test = a.Value;
yield return test;
}
}

}

请注意,如果您使用表达式树,您的代码很大程度上取决于传递给方法的表达式。我已经展示了一种使用常量和一种使用变量。但是当然可以有更多的场景。您可以重构此代码以针对这两种情况使用单一方法,但我认为这样可以更好地说明问题。

关于c# - 如何枚举传递的方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2062883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com