【问题标题】:Determining the number of parameters accepted by a method确定方法接受的参数数量
【发布时间】:2013-08-09 21:34:33
【问题描述】:

是否可以获取方法接受的参数数量,然后单独访问这些参数的值?我想创建一个方法,它将方法的所有参数的值连接起来,除了最后一个参数。但是,参数的数量和参数的名称取决于所访问的方法。

是否可以做类似下面的伪代码?

StringBuilder string = new StringBuilder();

for(int i = 0; i < Method.Parameters.Count - 1; i++)
{
     string.Append(Method.Parameters[i].Value);
}

非常感谢:)

【问题讨论】:

  • 将数组传递给方法...
  • 我想问你为什么要这样做,因为可能有更好的解决方案。
  • 基本上,我想通过多种方法验证通过的数字签名。数字签名通过首先连接所有方法的参数来验证,除了最后一个参数是数字签名本身,然后使用发送者的公钥根据接收到的数据计算签名。但是,对于大量接受的参数数量和类型不同的方法,我必须这样做。
  • 听起来您需要修改方法才能实现它。我很想为每个方法编写一个封装所有参数并实现GetHashCode() 的密封不可变类。然后你将传递该类的一个实例,你可以简单地使用它的哈希码。
  • 您是否考虑过为您的方法生成代码,例如,使用 T4 模板?

标签: c# string methods parameters


【解决方案1】:

这样就可以了:

Type.GetType("MyClassType").GetMethod("foo").GetParameters().Length;

【讨论】:

  • 非常感谢您的回答:) 还有一个问题。如何使用索引访问参数?
  • 我描述的方法仅作为描述性方法起作用。在执行该方法时,它不会为您提供参数的具体值。这只会为您提供有关参数的元数据。如果你想在执行方法时迭代参数,你应该使用数组。
【解决方案2】:

如果你有类似的方法

void Foo(string s, int x, int y, bool flag)

那么您不需要以编程方式确定参数的数量——您已经知道有 4 个参数。

{
    StringBuilder sb = new StringBuilder().Append(s)
                                          .Append(x)
                                          .Append(y);
}

如果您希望该方法接受任意数量的参数,那么您可以使用params keyword 来定义您的方法,如下所示:

void Baz(params object[] args)

参数作为数组传递给您的方法,因此您可以根据数组长度确定参数的数量:

{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < args.Length - 1; i++)
    {
        sb.Append(args[i]);
    }
}

用法:

Baz("xyzzy", 42, 0, false);

【讨论】:

  • 感谢您的建议。不幸的是,我有大约 20 种方法要修改,所以我认为如果我做一些通用的事情,我会节省一些时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多