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. 【原创】web端高德地图javascript API的调用

    关于第三放地图的使用,腾讯.百度.高德 具体怎么选择看你自己怎么选择了. 高德地图开放平台:http://lbs.amap.com/ 本次使用的是高德的javascript API http://lb ...

  2. 在eclipse创建android project,最后一步点击finish没反应

    在创建android project的时候,到最后一步点击finish没有反应. 本来以为可能是SDK中的Extra下Android Support Library没有安装,后来检查发现Minimum ...

  3. tp5 中 model 的获取器

    在获取数据的字段值后自动进行处理 // 模型中写入如下代码,则查询结果会自动将status的结果进行转换 class User extends Model { public function getS ...

  4. 修改linux的系统时间和时区

    时间: date命令将日期设置为2016年12月16日 ----   date -s 12/16/16 将时间设置为9点28分50秒 ----   date -s 09:28:50 时区: tzsel ...

  5. BFS_Maze_求解迷宫最短路径

    /* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...

  6. C++ 字符处理函数

    C/C++里有一个头文件#include <ctype.h>,里面定义了很多字符函数,在实际开发中,用起来很方面. int isalpha(int ch)  若ch是字母('A'-'Z', ...

  7. H5+ 移动app学习之二 Native.js

    Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术.如果说Node.js把js扩展到服务器世界,那么Native.js则把js扩展到手机 ...

  8. PyAutoGUI 简介

    转载来自: https://muxuezi.github.io/posts/doc-pyautogui.html http://blog.topspeedsnail.com/archives/5373 ...

  9. C 标准库系列之locale.h

    locale.h 区域设置相关,主要针对时间日期.货币格式.字符控制.数字格式等以满足某区域的设置需要. locale设置类别主要包括以下几个宏定义的类别: LC_ALL:设置所有的类别: LC_CO ...

  10. [Tool]使用ConfuserEx混淆代码

    为了防止程序发布后被一些"坏人"破解,开发者通常会对自己的代码进行混淆.这篇博客将介绍一款使用很广,并且混淆效果也不错的工具ConfuserEx. 新建一个C# 控制台程序,Hel ...