Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> C#/.Net  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701882
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

Linq中用反射生成非实体类的代码,作用只是加快点速度

作者:cg1  摘自:access911.net  :cg1  更新日期:2009-9-5  浏览人次:

 

Linq中用反射生成非实体类的代码,作用只是加快点速度

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Diagnostics;
using System.Text;


namespace access911.net
{
    /// <summary>
    /// 本类全部是静态方法,用反射机制获取 Linq 返回集合的字段名,并生成对应的类脚本,保存到 c:\LinqToClass.teml 文件中
    /// </summary>

    public static class AnalyseProperty
    {

        /// <summary>
        /// 调用方式如下:
        /// var temp1 = from c in db.BIDepartment
        ///            select new 
        ///            {
        ///                AddDate = c.AddDate,
        ///                DType = c.DType,
        ///                DepartmentName = c.DepartmentName,
        ///                FeedBack = c.FeedBack
        ///            };
        /// //用反射来自动生成对应的类 start
        /// if (temp1.Count() > 0)
        /// {
        ///    AnalyseProperty.PrintProperty("myclassname",temp1.First());
        /// }
        /// //用反射来自动生成对应的类 end
        /// </summary>
        /// <param name="className"></param>
        /// <param name="o"></param>

        public static void PrintProperty(string className,object o)
        {
            string fileName = "c:\\LinqToClass.tmpl";  //将生成的类模板输出到哪里

            Type objectType = o.GetType();
            System.Reflection.PropertyInfo[] p = objectType.GetProperties();
            StringBuilder s = new StringBuilder("");
            StringBuilder s2 = new StringBuilder("");
            s.AppendFormat("#region {0} {1}.{2} CreateDate:{3}\r\n", className,System.Environment.MachineName,System.Environment.UserName,DateTime.Now.ToString());
            s.AppendFormat("public partial class {0}\r\n{{", className);

            System.IO.StreamWriter file = new System.IO.StreamWriter(fileName);
            for (var i = 0; i < p.Length; i++)
            {
                Type property = p[i].PropertyType;
                if (property.IsGenericType)  //判断是否泛型
                {
                    if (property.GetGenericTypeDefinition() == typeof(Nullable<>)) //判断是否nullable
                    { //是 **? 类型
                        Type originalType = property.GetGenericArguments()[0];
                        s.AppendFormat("\r\n    private System.Nullable<{0}> _{1};", originalType.Name, p[i].Name);
                        s2.AppendFormat("\r\n    public System.Nullable<{0}> {1}", originalType.Name, p[i].Name);
                        s2.AppendLine("{");
                        s2.AppendFormat("\r\n        get{{return this._{0};}}", p[i].Name);
                        s2.AppendFormat("\r\n        set{{if ((this._{0} != value)){{this._{0} = value;}}}}", p[i].Name);
                        s2.AppendLine("\r\n    }");
                        //if (originalType == typeof(int))  //做比对时可以直接取Name,也可以直接用typeof取
                    }
                }
                else
                {
                    s.AppendFormat("\r\n    private {0} _{1};", property.Name, p[i].Name);
                    s2.AppendFormat("\r\n    public {0} {1}",property.Name,p[i].Name);
                    s2.AppendLine("    {");
                    s2.AppendFormat("\r\n        get{{return this._{0};}}", p[i].Name);
                    s2.AppendFormat("\r\n        set{{if ((this._{0} != value)){{this._{0} = value;}}}}", p[i].Name);
                    s2.AppendLine("\r\n    }");
                }
            }
            s.AppendFormat("{0}\r\n}}",s2);
            s.AppendLine("\r\n#endregion");
            file.Write(s);
            file.Close();
            Debug.Print("{0}",s);
        }
    }
}



上述文章只代表作者的学习经历,并非绝对正确,仅供参考!

本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     .NET 中用反射来生成和执行 IList<IInterfaceType> 的属性
     Linq中一旦使用Join就无法用Skip来进行分页
     Linq中使用C#自定义函数生成的新字段不支持where和排序
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利