说我有
interface IFoo
{
/// <summary>
/// Comments about Bar method goes here.
/// </summary>
void Bar();
}
我正在使用反射在运行时显示方法
MethodInfo[] mis = typeof(IFoo).GetMethods();
但我想知道我是否可以获得<summary> </summary>
中包含的评论方法。我意识到注释只是忽略了我的编译器,但有什么可以做的来检索注释吗?现在我有一个单独的文件,有方法和评论,但我讨厌冗余,并想知道是否有任何方法可以做到这一点。
谢谢,
答案 0 :(得分:15)
C#编译器csc.exe有一个/doc选项,用于输出具有三次斜杠注释的外部XML文件。文档生成器使用此XML文件(例如Sandcastle执行此类操作)。
Visual Studio提供了导出XML注释的相同选项。要在Visual Studio开发环境中设置此编译器选项:
您可以使用.NET框架中的XML解析器加载此XML文件,访问其中的Types,并从中获取相关的注释。
你是对的,C#编译器不会将注释编译到元数据中。但是,Microsoft为导出功能创建了三重斜杠注释,因此您可以获得它们的句柄。
Instructions for processing the XML file are here on MSDN
例如,我启用了XML输出文件选项并记录了以下方法:
/// <summary>
/// This method parses the given name for
/// capitalization.
/// </summary>
public void ParseStringCase(string name)
{
// behaviour of method...
}
它在bin /文件夹中的文件中生成以下XML ....
<?xml version="1.0"?>
<doc>
<assembly>
<name>WindowsFormsApplication3</name>
</assembly>
<members>
<member name="M:WindowsFormsApplication3.Form1.ParseStringCase(System.String)">
<summary>
This method parses the given name for
capitalization.
</summary>
</member>
</members>
</doc>
答案 1 :(得分:7)
您还可以创建属性类并以此方式获取信息。所以你的方法/界面看起来像这样:
[AttributesTest("Test", "Test comments")]
public void Method(object sender, EventArgs e)
{
//do something here
}
您的属性类将如下所示:
[AttributeUsage(AttributeTargets.Method)]
sealed class AttributesTest : Attribute
{
public string sName;
public string sDescription;
public string Name
{
get { return sName; }
set { sName = value; }
}
public string Description
{
get { return sDescription; }
set { sDescription = value; }
}
public AttributesTest(string _name, string _desc)
{
this.Name = _name;
this.Description = _desc;
}
}
然后,您可以检索每个接口/方法的名称和描述。您并没有真正收到评论,但它会获得您指定的任何信息。当我需要获取有关程序中的方法/接口的信息时,我觉得这很有用。我希望这有帮助!
答案 2 :(得分:4)
添加到John K的答案:无法使用反射检索评论。您始终需要一个提供注释的单独文件。使用编译器中的XML文档文件是最好的方法,因为它是此信息的默认格式。
答案 3 :(得分:1)
解决方法 - 将Program.DLL / EXE上的反射与Program.XML文件一起使用
有关如何实施John K.计划的详细信息,请查看here