【问题标题】:Find which function use a certain attribute查找哪个函数使用某个属性
【发布时间】:2016-04-10 06:09:30
【问题描述】:

我在看一个开源的c#项目,在一些基础类中,有很多自定义属性,如下:

[Parameter("aaa", typeof(int), "this is aaa")]
[Parameter("bbb", typeof(bool), "this is bbb")]
[Serializable]
public class Number : DataElement
{
       ...
}

现在我需要了解这些自定义属性,但没有文档。 所以我需要根据这些自定义属性找到哪个函数做事。通过阅读这些函数,我可以明白其中的含义。

有没有彻底的方法来定位项目中的函数,函数会根据某些自定义属性做某事?

【问题讨论】:

  • “使用这些属性”到底是什么意思?属性只不过是描述代码成员的元数据,并且可以通过 .NET 反射(通过任何一段代码)查找此元数据。见stackoverflow.com/questions/720157/…
  • 我想我应该澄清“使用这些属性”的含义,我的意思是不直接将它用于某些类,就像我问题中的示例一样。它对已经描述的类做一些事情通过属性。我想找到一些函数根据它已经拥有的属性对类做一些事情。
  • 这是自定义属性类吗?在这种情况下,搜索 ParameterAttribute 应该会引导您找到正在使用它的代码(如果它正在被使用的话)。否则,我将首先查找这些属性的文档。我可以找到至少两个同名的类:System.Management.Automation.ParameterAttributeSystem.Data.Linq.Mapping.ParameterAttribute,所以当然,你必须先弄清楚你要处理的是哪一个。
  • 请注意,在[Parameter(...)] 上使用“查找所有引用”会查找对属性的构造函数 的引用。您需要找到对该属性 class 的所有引用。转到其定义,单击类名,然后“查找所有引用”。
  • 哦,我确定它是一个自定义属性,我找到了它的定义。你说我可以在整个解决方案中搜索“ParameterAttribute”,我试过了,但我什么也没找到想,这是否意味着这些属性只是被定义并提供给类,但是没有函数使用这些属性来做事,即它们现在对程序什么都不做?

标签: c#


【解决方案1】:

属性旨在将元数据添加到代码元素(例如类)。任何一段代码都可以通过 .NET Reflection as in this answer 读取此元数据。

有些属性是由编译器读取的(如[Serializable]),有些是由特定的.NET框架如ASP.NET MVC读取的(如[Route],其中only works if you call RouteTable.Routes.MapMvcAttributeRoutes()),您可以自定义用于您自己目的的属性。

一般来说,我建议您阅读有关您感兴趣的特定属性的文档,以了解它的作用。如果您需要查看使用它的代码,您可以使用诸如.NET ReflectorILSpy 之类的工具(假设您知道该代码在哪个 .NET 程序集中 - 再次通过文档)。

如果您能解释一下为什么需要它,这可能会有所帮助,因为知道什么函数查找特定属性(除非它是您自己的自定义属性)似乎并没有太大的好处,只要您知道什么是为了。

【讨论】:

  • 哦,我感兴趣的所有属性都是项目作者实现的自定义属性,所以很难获得属性的文档。我想为项目添加一些新功能,因此我需要添加一些新参数。我发现每个旧参数都有一个对应的属性,比如参数 aaa 有 [Parameter("aaa", typeof(int), "this is aaa")]。
  • 首先,我感兴趣的属性是自定义属性。其次,我想知道这些属性的含义,这个开源项目没有属性的文档。所以我需要定位该函数收集属性的信息并使用它来做事。
  • 忘记第一条评论了,它有很多多余的描述。
  • @aicco:如果它是一个开源项目,那么您可能可以访问它的修订历史。也许搜索引入或修改该属性类的提交可能会产生一些有用的信息。
  • 好的,它是开源的。您应该能够创建最新版本的本地副本或克隆,然后使用 Visual Studio 在源代码中搜索 ParameterAttribute 以了解其使用方式。你也可以在项目上打开一个问题,从项目所有者那里了解它是如何使用的。
【解决方案2】:

属性只不过是一种信息。此信息可以附加到您的方法、类、命名空间、程序集等。

访问以下网址你会很清楚。

【讨论】:

    【解决方案3】:

    我建议你在某处写一段 sn-p 代码,然后输出到文件、控制台或调试器。

    首先,您需要遍历每种类型的每个方法,然后检查它是否具有您要查找的属性。我猜是ParameterAttribute

    例如:

    var methods = assembly.GetTypes()
                          .SelectMany(t => t.GetMethods())
                          .Where(m => m.GetCustomAttributes(typeof(ParameterAttribute), false).Length > 0)
                          .ToArray();
    foreach (var assemblyMethod in methods)
    {
        Console.WriteLine(assemblyMethod.Name);
        // or do other stuff here
    }
    

    有关获取自定义属性的更多信息,请阅读Here。此外,这是反射的一部分,您可以了解更多关于Here

    【讨论】:

    • 我想我应该澄清“使用这些属性”的含义,我的意思是不直接将它用于某些类,就像我问题中的示例一样。它对已经描述的类做一些事情通过属性。我想找到一些函数根据它已经拥有的属性对类做一些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多