1.根据要生成的csv来构造我们的Attribute:
//标签
public class TagNameAttribute : Attribute
{
public string TagName
{
get;
set;
}
public TagNameAttribute(string tagName)
{
TagName = tagName;
}
}
//备注
public class RematkAttribute : Attribute
{
public string Remark { get; set; }
public RematkAttribute(string remark)
{
Remark = remark;
}
}
2.将实体类及类属性进行标记特性:
[TagName("*配置信息")]
[Rematk("备注")]
public class TableConfig
{
/// <summary>
/// 配置类型 默认插入新数据
/// </summary>
[TagName("配置类型")]
[Rematk("(1-删除所有数据、2-删除时间周期数据、3-直插入最新数据、99-自定义任务)")]
public int JobType { get; set; }
/// <summary>
/// 是否为时间时序表 默认为True
/// </summary>
public bool IsTimeSeries = true;
/// <summary>
/// 删除数据周期时间
/// </summary>
[TagName("删除数据周期时间")]
[Rematk("(以秒为单位)")]
public int? DelectCycle { get; set; }
private int refreshCycle = 60;
/// <summary>
/// 巡检周期
/// </summary>
[TagName("刷新周期")]
[Rematk("(以秒为单位)")]
public int RefreshCycle
{
get
{
return refreshCycle;
}
set
{
refreshCycle = value;
}
}
}
3.将实体类解析到CSV文件中:
public static void SaveConfigModel(string fileName, object obj)
{
string name;
List<string> props = new List<string>();
List<List<string>> items = new List<List<string>>();
object[] objs = obj.GetType().GetCustomAttributes(typeof(TagNameAttribute), true);
//类不包含TagName特性或者文件中没有TagName项 返回null
if (objs == null || objs.Length == 0)
{
return;
}
object[] robjs = obj.GetType().GetCustomAttributes(typeof(RematkAttribute), true);
if (robjs != null || robjs.Length > 0)
{
name = (objs[0] as TagNameAttribute).TagName + ",," + (robjs[0] as RematkAttribute).Remark;
}
else
{
name = (objs[0] as TagNameAttribute).TagName + ",";
}
//遍历属性
foreach (PropertyInfo propInfo in obj.GetType().GetProperties())
{
//属性中不包含 TagName特性 跳出本次循环
object[] objAttrs = propInfo.GetCustomAttributes(typeof(TagNameAttribute), true);
object[] objRemarks = propInfo.GetCustomAttributes(typeof(RematkAttribute), true);
if (objAttrs == null || objAttrs.Length == 0)
{
continue;
}
object value = propInfo.GetValue(obj, null);
//如果属性是List类型
if (value is System.Collections.IList)
{
List<string> item = new List<string>();
items.Add(item);
item.Add((objAttrs[0] as TagNameAttribute).TagName);
object objItem = (value as System.Collections.IList).GetType().GetGenericArguments()[0].GetConstructor(new Type[0]).Invoke(null);
string itemStr = "";
foreach (PropertyInfo propInfoItem in objItem.GetType().GetProperties())
{
object[] objItems = propInfoItem.GetCustomAttributes(typeof(TagNameAttribute), true);
if (objItems == null || objItems.Length == 0)
{
continue;
}
itemStr += (objItems[0] as TagNameAttribute).TagName + ",";
}
item.Add(itemStr);
foreach (object valueItem in (value as System.Collections.IList))
{
string valueStr = "";
foreach (PropertyInfo propInfoItem in valueItem.GetType().GetProperties())
{
object[] objItems = propInfoItem.GetCustomAttributes(typeof(TagNameAttribute), true);
if (objItems == null || objItems.Length == 0)
{
continue;
}
valueStr += propInfoItem.GetValue(valueItem, null)?.ToString() + ",";
}
item.Add(valueStr);
}
}
else
{
if (objRemarks == null || objRemarks.Length == 0)
{
props.Add((objAttrs[0] as TagNameAttribute).TagName + "," + (value == null ? "" : value.ToString()) + ",");
}
else
{
props.Add((objAttrs[0] as TagNameAttribute).TagName + "," + (value == null ? "" : value.ToString()) + ","+ (objRemarks[0] as RematkAttribute).Remark);
}
}
}
List<string> line = new List<string>();
line.Add(name);
line.AddRange(props);
line.Add("/,");
items.ForEach(c => { line.AddRange(c); line.Add("/,"); });
File.WriteAllLines(fileName, line, Encoding.Default);
}
4.客户程序调用:
CsvHelper.SaveConfigModel(apppath + "\\" + tableConfig.FileName + ".csv", tableConfig);

网友评论