C#可以通过反射读取类的字段/方法等,可是该如何获取该字段的XML注释?

具体目的:有一个实体类,页面需要有一个与其对应的table,样式大体为

      <tr>
<td>地东经</td>
<td>
<input id='txt_Longitude' type='text' class='form-control' name='Longitude' /></td>
<td>北纬</td>
<td>
<input id='Latitude' type='text' class='form-control' name='Latitude' /></td>
</tr>

其实体类,大致为:

     /// <summary>
/// 东经
/// </summary>
public double? Longitude
{
get{ return _Longitude; }
set
{
this.OnPropertyValueChange(_.Longitude,_Longitude,value);
          this._Longitude=value;
       }
     }

由于实体类中属性很多,生成页面的工作量很大,所以想通过反射的方式,读取实体的XML注释及其属性名称,写个循环即可生成上述页面

后查阅相关资料,XML注释是不写入DLL里的,所以直接通过反射的方式获取XML注释是不可能的.

有建议通过对XML文件进行解析,获取其XML注释的

万能的老外已经处理过类似的问题了,参考这里

其提供了一个处理用的类库以及示例

1.在VS里打开项目属性中的XML文档注释功能

即在项目的bin目录中生成一个以当前项目命名的xml文件,读取该文件,即可获取XML注释

2.按照如下方式,获取XML注释

XmlElement documentation = DocsByReflection.XMLFromMember(typeof(SomeExampleClass).GetProperty("ExampleProperty"));
Console.WriteLine(documentation["summary"].InnerText.Trim());

下载链接:

docsbyreflection_2

通过反射获取字段名称/字段类型/及其XML注释,即可根据需要生成页面HTML,示例如下:

StringBuilder sb = new StringBuilder();
string rowtemp = "<tr>\r\n" +
"<td>{0}</td>\r\n " +
"<td>" +
"<input id = 'txt_{1}' type = 'text' class='form-control' name='{1}' /></td>\r\n" +
"<td>{2}</td>\r\n" +
"<td>\r\n" +
"<input id = '{3}' type='text' class='form-control' name='{3}' /></td>\r\n" +
"</tr>\r\n"; //遍历基本属性,生成表
PropertyInfo[] ProList = tp1.GetProperties();
List<string> ignoreList = new List<string>();
ignoreList.Add("Project_Code");
bool toEnd = false; #region 区分字段类型
for (int i = 0; i < ProList.Length; )
{
         //下述循环为了实现对字段的过滤,以及一行两个<td>,所以,需要检索出下一个可用的字段对象,看上去比较绕
while (ignoreList.Contains(ProList[i].Name))
{
i++;
if (i == ProList.Length)
{
toEnd = true;
break;
}
}
if (toEnd)
{
break;
}
PropertyInfo p1 = ProList[i];
i++;
PropertyInfo p2 = null;
if (i < ProList.Length)
{
while (ignoreList.Contains(ProList[i].Name))
{
i++;
if (i == ProList.Length)
{
toEnd = true;
break;
}
}
} if (toEnd || i == ProList.Length)
{ }
else
{
p2 = ProList[i];
i++;
}
sb.AppendLine("<tr>");
if (p2 != null)
{
string str1 = getHTML(tp1, p1);
string str2 = getHTML(tp1, p2);
sb.AppendLine(str1);
sb.AppendLine(str2);
}
else
{
string str1 = getHTML(tp1, p1);
sb.AppendLine(str1);
}
sb.AppendLine("</tr>");
}
#endregion write2Text(@"C:\STD\"+tp1.Name+".txt", sb);
Console.WriteLine("结束");
Console.ReadLine();
public static string getCommentText(Type tp1,string nm)
{
Console.WriteLine(nm);
XmlElement documentation = DocsByReflection.XMLFromMember(tp1.GetProperty(nm));
Console.WriteLine(documentation["summary"].InnerText.Trim());
return documentation["summary"].InnerText.Trim();
} public static void write2Text(string filename, StringBuilder sb)
{
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.Write(sb.ToString());
sw.Flush();
}
}
} public static string getHTML(Type tp1,PropertyInfo p)
{
if (p.Name.Trim() == "Conveyance_Tunnel_Import_Elevation")
Console.WriteLine("");
string inputTD = "<td>{0}</td>\r\n " +
"<td>\r\n" +
"<input id = 'txt_{1}' type = 'text' class='form-control' name='{1}' />\r\n"+
"</td>\r\n"; string selectTD = @"<td>{0}</td>
<td>
<select id='{1}' class='form-control' name='{1}'>
{2}
</select>
</td>"; string chkTD = @"<td>{0}</td>
<td>
<label for='chkY_{1}'>是<input type='checkbox' id='chkY_{1}' value='true' class='form-control' name='{1}'></label>
<label for='chkN_{1}'>否<input type='checkbox' value='false' id='chkN_{1}' class='form-control' name='{1}'></label>
</td>"; if (p.PropertyType == typeof(Guid?)||p.PropertyType==typeof(Guid))
{
//GUID类型的,去数据库中查找并生成Select
StringBuilder optSb = new StringBuilder();
DataTable dt = SqlHelper.ExecuteDataTable("select * from Foreign_Key_Table where Column_Code=@cc and Table_Code=@tc order by Order_ID",
new SqlParameter("@cc", p.Name),new SqlParameter("tc",type_code));
if (dt.Rows.Count > )
{
for (int i = ; i < dt.Rows.Count; i++)
{
optSb.AppendLine(string.Format("<option value='{0}'>{1}</option>", dt.Rows[i]["Key_Code"], dt.Rows[i]["Key_Name"]));
}
return string.Format(selectTD, getCommentText(tp1, p.Name), p.Name, optSb.ToString());
}
else
{
//如果没有查到,非外键表,直接显示
return string.Format(inputTD, getCommentText(tp1, p.Name), p.Name);
}
}
else if (p.PropertyType == typeof(bool?) || p.PropertyType == typeof(bool))
{
return string.Format(chkTD,getCommentText(tp1, p.Name),p.Name);
}
else
{
//生成input
return string.Format(inputTD,getCommentText(tp1,p.Name),p.Name);
}
}

C# 读取XML注释的更多相关文章

  1. C#中常用的读取xml的几种方法(转)

    本文完全来源于http://blog.csdn.net/tiemufeng1122/article/details/6723764,仅作个人学习之用. XML文件是一种常用的文件格式,例如WinFor ...

  2. C#读取XML文件的方法

    先写一个xml文件: <?xml version="1.0" encoding="utf-8" ?> <bookste> <!-- ...

  3. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  4. C#读取Xml【转】

      XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

  5. asp.net读取xml方法

    这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...

  6. C#基础精华06(Linq To XML,读取xml文件,写入xml)

    1.XML概述: 可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言,侧重于存储数据. 2.XML特点 xml 标记语言 html x ...

  7. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  8. .Net 读取xml

    一.常规方法 1.知识介绍 //初始化一个xml对象 XmlDocument xml = new XmlDocument(); //加载xml文件 xml.Load("文件路径") ...

  9. C#读取XML方式

    前言 前一篇我们简单给大家做了XML的介绍,现在咱们继续这个系列 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的 ...

随机推荐

  1. 有人要分享pjax吗?

    安装 1.在 composer.json 的 require里 加入 "yuanchao/pjax-for-laravel-5": "dev-master" 2 ...

  2. 【纯css】左图右文列表,左图外框宽度占一定百分比的正方形,右上下固定,右中自动响应高度。支持不规则图片。

    查看演示 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  3. October 27th Week 44th Thursday 2016

    The art of being wise is the art of knowing what to overlook. 智慧之道在于懂得该忽略什么. Always do your best. Wh ...

  4. Navicat Premium连接Oracle 问题汇总

  5. Chrome 桌面通知Notification

    今天2016-11-18号,最新chrome版本:V50 在网上找了好久都用不了,因为chrome版本已经是V50了,chrome在V22版本之后就取消掉window.webkitNotificati ...

  6. GruntJS学习(转)

    GruntJS 是基于JavaScript的命令行构建工具,它可以帮助开发者们自动化重复性的工作.你可以把它看成是JavaScript下的Make或者Ant.它可以完成诸如精简.编译.单元测试.lin ...

  7. ppmoney

    build/config.js 改 8080端口 build/webpack.dev.conf.js 改路径简写 alias:{ 'vux-components':'vux/dist/componen ...

  8. Linux中SysRq的使用(魔术键)

    转:http://www.chinaunix.net/old_jh/4/902287.html 魔术键:Linux Magic System Request Key Hacks 当Linux 系统不能 ...

  9. ecplise + hadoop 调试环境搭建

    1.需要安装包 1.1 hadoop源码包(hadoop-2.5.2-src.tar.gz) 1.2 hadoop 2X插件(hadoop2x-eclipse-plugin-master.zip) 1 ...

  10. 利用DNS Zone Transfers漏洞工具dnswalk

    利用DNS Zone Transfers漏洞工具dnswalk   DNS Zone Transfers(DNS区域传输)是指一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库.当主服 ...