如何将方法参数存储到数组中?

6

假设在一个课堂上,你遇到了这个方法:

float Do(int a_,string b_){}

我想尝试做类似这样的事情:

float Do(int a_, string b_)
{
  var params = GetParamsListOfCurrentMethod(); //params is an array that contains (a_ and b_)
}

有人能帮忙吗?

为什么我想要这样做呢?

想象一下你有一个接口:

public Interface ITrucMuch
{
 float Do(int a_,string b_);
 // And much more fct
}

许多类实现该接口

还有一个特殊的类也实现了该接口:

public class MasterTrucMuch : ITrucMuch
{
  public floatDo(int a_, string b_) 
  {
    ITrucMuch tm = Factory.GetOptimizedTrucMuch(); // This'll return an optimized trucMuch based on some state
    if(tm != null)
    {
      return tm.Do(a_,b_);
    }
    else
    {
      logSomeInfo(...);
    }

    //do the fallback method
  }

由于接口包含许多方法,并且所有方法的第一行始终相同(检查当前实例是否有更好的接口,如果有,则在实例上调用相同的方法),因此我尝试对其进行方法化处理。

谢谢


你是否使用过.NET反射来查看运行时的方法及其参数? - Robbie Tapping
8
为什么?如果您解释想要这样做的原因,可能会有更好的解决方案。 - Yuck
1
你想要值还是名称?或者两者都要。你是否想要记录它们? - Ray
对@Yuck和Ray的评论点个赞。不清楚您是想将值排列在数组中,还是想将参数名称传递给方法。 - Dr. Andrew Burnett-Thompson
我进行了编辑,使其更加清晰(希望如此)。 - Pit Ming
5个回答

13
你可以像这样做:
var parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters)
{
    //..
}

请看一下ParameterInfo类。


1
var params = GetParamsListOfCurrentMethod();

params 是 C# 的关键字,因此不能像上面那样用作变量名。

这里有一个关于如何使用 params 关键字的链接 http://msdn.microsoft.com/en-us/library/w5zay9db.aspx

以下是从文章中提取的一些示例代码。

public static void UseParams(params int[] list)
{
    for (int i = 0; i < list.Length; i++)
    {
        Console.Write(list[i] + " ");
    }
    Console.WriteLine();
}

当然,如果我可以更改这个方法的签名就太简单了...但事实并非如此。 - Pit Ming
1
@PitMing 对不起,我误解了你的问题。你的目标是什么? - user1231231412
1
如果非常必要:var @params = GetParamsListOfCurrentMethod(); - Lorenz Lo Sauer


0

你可以像这样使用动态参数编写函数:

    protected void Do(params object[] list)
    {
            if (list.Length < 2)
                return;

            int a_=(int)list[0];
            string b_=list[1].ToString();
    }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接