【问题标题】:C# - Investigating "Method' information using Reflection?C# - 使用反射调查“方法”信息?
【发布时间】:2009-09-22 04:33:27
【问题描述】:

我的目的是使用反射来研究类型的“方法”,以验证以下内容:

  1. 方法应该是实例方法和公共的。

  2. 取参数“params”,性质为空。

  3. 方法不进行递归调用。

我一开始是:

static void ProcessMethodInfo(Type t)
    {
        MethodInfo[] info = t.GetMethods();

        foreach (MethodInfo mi in info)
        {

          // How to check the conditions here ?  

        }
    }

但我不知道如何进一步进行。需要帮助。

【问题讨论】:

  • 我认为第 3 项将很难正确测试。出于您的目的,如果方法与另一个方法相互递归(即方法 a 调用 b 调用 a),它是否是递归的?
  • 谢谢。我正在测试方法递归本身而不是相互的。例如斐波那契数列。
  • @csharpbaby:即使这样也很困难,并且无法通过反射实现。

标签: c# reflection


【解决方案1】:

好吧,如果 3 你的意思是 检查中的方法应该是非递归的;那么这很痛苦-您需要解析IL。但是对于其他人;

    Type type = ...
    var qry = from method in type.GetMethods(
                  BindingFlags.Instance | BindingFlags.Public)
              where method.ReturnType == typeof(void)
              let parameters = method.GetParameters()
              where parameters.Length == 1
              && parameters[0].ParameterType.IsArray
              && Attribute.IsDefined(parameters[0], typeof(ParamArrayAttribute))
              select method;
    foreach (var method in qry)
    {
        Console.WriteLine(method.Name);
    }

【讨论】:

  • 我认为应该避免使用 == 来比较类的实例。 Equals 可能会被覆盖,但 == 通常不会被重载。
  • 你的意思是Type?这是完全有效的。我知道你在说什么,但代码没问题。
  • 优秀的马克。非常感谢。
  • 我并不是说代码不正确。我是说通常应该避免使用 == 来比较类的实例,因为大多数情况下它是不正确的。无论如何,这是一个小问题,但我想我不妨发表评论。
  • 你这样做是对的;我过去也发表过完全相同的评论;-p
【解决方案2】:

【讨论】:

    【解决方案3】:

    我认为您无法使用反射检测项目 3。

    【讨论】:

      【解决方案4】:

      检查 MethodInfo 类的以下成员:

      • 是公共的
      • 是静态的
      • 返回类型
      • GetParameters() 方法

      为了能够检查该方法是否是递归的,我认为您需要的不仅仅是简单的反射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        相关资源
        最近更新 更多