匪利用反射的实业类方案

by admin on 2018年12月16日

关押了众多ORM的实业类方案,大多是用反射来读数据库数据,这样当数操作实体类的时候效率特别没有,我借鉴了一致号朋友之笔触,接纳.NET
2.0的泛型技术,为实体类提供一个通用的询问以及持久化方案。

       昨天看来同样段落VB.NET代码,其中的IComparer(Of
Match)一远在扣留不知道,想把她转为C#,只盼实现IComparer接口。后查资料就是VB.NET中泛型。

优先看看实体类定义:

1 Public Class AlphaComparer
2    Implements IComparer(Of Match)

4    Public Function Compare(ByVal x As System.Text.RegularExpressions.Match, ByVal y As System.Text.RegularExpressions.Match) As Integer Implements System.Collections.Generic.IComparer(Of System.Text.RegularExpressions.Match).Compare
5       Return String.Compare(x.Value, y.Value, True)
6    End Function
7 End Class

 

      依照泛型在C#受之语法,转换为:

哲学原理 1哲学原理 2代码

1     public class AlphaComparer : IComparer<Match>
2     {
3         public int Compare(System.Text.RegularExpressions.Match x, System.Text.RegularExpressions.Match y)
4         { 
5             return string.Compare(x.Value, y.Value, true);
6         }
7     }

using PWMIS.DataMap.Entity;

VB.NET 2005中 **建立泛型类

namespace PLZDModel
{
    public class PFT_Report : Entity
    {
        public PFT_Report()
        {
            TableName = “PFT_Report”;
            //IdentityName = “标识列”;//假使指定了标识列,可以拍卖由增列插入问题
            //PrimaryKeys.Add(“主键列”);//指定主键列方可以去除和更新实体数据

**  使用泛型的时候,你应当选生大面积用途的好像,这样的话建立泛型类所需要之辰最后会当调减支出时间方面与你回报。例如,集合就是同一种处理多单数据类型的类,并且一般你会于差不两只应用程序中使及一个聚集的多种不同的款型。你切莫待每回因草稿建立汇集,而是以泛型建立一个泛型类原型(prototype)。首先,你要让代码添加如下所著之Imports语句:

            AddProperty(“ID”, default(System.Int32));
            AddProperty(“FinancialPlanersNo”, default(System.String));
            AddProperty(“FundAccount”, default(System.String));
            AddProperty(“CityCode”, default(System.String));
            AddProperty(“BankCode”, default(System.String));
            AddProperty(“NetWork”, default(System.String));
            AddProperty(“ApplyTime”, default(System.DateTime));
            AddProperty(“FileName”, default(System.String));
            AddProperty(“GenerateTime”, default(System.DateTime));
        }

Imports System.Collections.Generic

        public System.Int32 ID
        {
            get { return (System.Int32)getProperty(“ID”); }
哲学原理,            set { setProperty(“ID”, value); }
        }

  添加Imports语句后,你就是得建立泛型类了。基本的类看起很常见。你可行使性能、函数、子程序、字段或可以当近似吃应用的其它任何东西,如列表1所呈现:

        public System.String FinancialPlanersNo
        {
            get { return (System.String)getProperty(“FinancialPlanersNo”); }
            set { setProperty(“FinancialPlanersNo”, value); }
        }

  列表1.定义一个泛型类类型

        public System.String FundAccount
        {
            get { return (System.String)getProperty(“FundAccount”); }
            set { setProperty(“FundAccount”, value); }
        }

Public Class MyGenericCollection(Of ItemType)

 ’ 定义一个通用的集合
 Private Items As Collection(Of ItemType)

 ’ 建立构造函数
 Public Sub New()
  Items = New Collection(Of ItemType)
 End Sub

 ’ 返回集合中数据项的数量
 Public ReadOnly Property Count() As Integer
  Get
   Return Items.Count
  End Get
 End Property

 ’ 得到或设置一个特定的数据项
 Default Public Property Item(ByVal Index As Integer) As ItemType
  Get
   Return Items(Index)
  End Get
  Set(ByVal value As ItemType)
   Items(Index) = value
  End Set
 End Property

 ’ 给集合添加新的数据项
 Public Sub Add(ByVal Value As ItemType)
  Items.Add(Value)
 End Sub

 ’ 从集合中删除数据项
 Public Sub RemoveAt(ByVal Item As Int32)
  Items.RemoveAt(Item)
 End Sub

End Class

        public System.String CityCode
        {
            get { return (System.String)getProperty(“CityCode”); }
            set { setProperty(“CityCode”, value); }
        }

  那些看似的扬言看起非常广泛,可是要留心“(Of
ItemType)”条目。这些条款就是泛型类及标准类的区别。你可以拿它们看成是一个占用位符,在将来实例化这多少个近乎的当儿,你需要提供项目。当.NET框架组件发现此条款的时,它用用是看似的代码所提供的色来替换这么些条款。当然,你没有必要当看似吃使用ItemType(数据项类型)——你可拿泛型类随便叫什么名字,就比如啊变量命名一样。

        public System.String BankCode
        {
            get { return (System.String)getProperty(“BankCode”); }
            set { setProperty(“BankCode”, value); }
        }

  由于当下是一个集合类,代码首先实施的事体是白手起家一个保障集合的全局变量。可是,由于你望把这集与泛型数据类型关联起来,由此还行使专用的“(Of
ItemType)”条目告诉.NET框架组件来建一个一定的聚集。这便是青出于蓝数据类型定义初叶于效用的地点。尽管你并不知道集合将以的数据类型,可是.NET框架组件将谋面,而且能为而建这种数据类的成团。

        public System.String NetWork
        {
            get { return (System.String)getProperty(“NetWork”); }
            set { setProperty(“NetWork”, value); }
        }

  在富有的近乎中您都须带有一个构造函数或者New()子程序。在例子中构造函数实例化集合。同样,一定要运用“(Of
ItemType)”代码来保证代码是地比泛型数据。

        public System.DateTime ApplyTime
        {
            get { return (System.DateTime)getProperty(“ApplyTime”); }
            set { setProperty(“ApplyTime”, value); }
        }

  你可像常常相同使用这集。例如,Count属性重回集合中数项的数目。实际上,这段代码和标准类中拔取的代码看起没距离。

        public System.String FileName
        {
            get { return (System.String)getProperty(“FileName”); }
            set { setProperty(“FileName”, value); }
        }

  有时你不能够不处理特定的数目项类型。Item属性演示了这种规律。请小心,这一个特性重返一个ItemType类型的值——你现在并不知道数据的路,但是将来.NET框架组件会指定项目。实际上,当自身立者类似的时光,IDE自动地也己起了正确的Set()方法。请留意,这个法子吧靠让ItemType。然则,使用泛型并不曾阻止你建专业的属性条目。例如,property属性是者近乎的默认值,因为大家以Default关键字定义了它们。

        public System.DateTime GenerateTime
        {
            get { return (System.DateTime)getProperty(“GenerateTime”); }
            set { setProperty(“GenerateTime”, value); }
        }

  这么些类似的末段是简单个子程序。第一单基于ItemType给集合添加新值;第二只以数据项编号从集合中剔除一个价。开发者不容许拿错的数据类型添加到聚集中,因为.NET框架组件指定并监视在数据类型。由此,你不要顾虑有人资了体系错误的数,固然这仿佛接受了普通的输入。大家管这种力量及运用Object举办自查自纠,使用Object时开发者可能提供任何项目标输入音讯,而你要履行检测以确保它们是不易的门类。

    }
}

       ….关于VB.NET2005蒙的泛型请参见
            <<Visual Baisc.NET
2005饱受行使泛型>>
           
http://dev.yesky.com/SoftChannel/72342380468240384/20041116/1876323.shtml

从此,便足以如此使实体类:
1,查询:

哲学原理 3哲学原理 4代码

 class Program
    {
        static void Main(string[] args)
        {
            PFT_Report utlReport = new PFT_Report();
            OQL oqlQuerry = new OQL(utlReport);
            utlReport.FundAccount = “1234234242423”;
            oqlQuerry.TopCount = 3;
            //OQL 表明式假设单步调试,将会面出调节陷阱,Where 子句以可能会晤带齐Select子句被之字段
            oqlQuerry.Select(utlReport.ApplyTime , utlReport.BankCode,utlReport.FileName ,utlReport.FundAccount )
                .Where(utlReport.FundAccount)
                .OrderBy(utlReport.GenerateTime, “desc”);
            Console.WriteLine (“SQL=”+oqlQuerry.ToString ());

            PFT_FundReviews p = new PFT_FundReviews();
            OQL q = new OQL(p);
            q.TopCount = 1;
            p.BankCode = null;// “20”;
            p.FundCode = “KF001”;
            q.Select().Where(p.BankCode, p.FundCode).OrderBy(p.addDate, “desc”);

            Console.WriteLine(“SQL=” + q.ToString());
            Console.Read();

        }
    }

用该法,可以选择实体类指定的字段,而未是一模一样浅采纳全体字段。这对于一个备大字段的申来说特别有因而。字段的挑三拣四都是经实体类对象.属性
的点子,完周全向对象,用起有点像LINQ,呵呵。

否啥说读取数据不欲反射?因为PDF.NET的实体类暴发内置的“属性名-属性值”字典,我们来探现实是何许兑现之:

哲学原理 5哲学原理 6代码

/// <summary>
        /// 按照数量阅读器对象,查询实体对象集合(注意查询了将自动释放该阅读器对象)
        /// </summary>
        /// <param name=”reader”></param>
        /// <returns></returns>
        public static List<T> QueryList(System.Data.IDataReader reader)
        {
            List<T> list = new List<T>();
            using (reader)
            {
                while (reader.Read())
                {
                    T t = new T();
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        if (!reader.IsDBNull(i))
                            t.setProperty(reader.GetName(i), reader.GetValue(i));
                    }
                    list.Add(t);
                }
            }
            return list;
        }

直白调用实体类的setProperty 方法即可。

 

保留数据也相当简单,为指定的性能设置新值即可:

PFT_Report utlReport = new PFT_Report();
            utlReport.FundAccount = “1234234242423”;
           EntityQuery<PFT_Report>.Save(utlReport);

卿这一次更新了不怎么个字段,框架只是会师变要更新的字段的SQL语句,整个框架可以完全不下反射来处理数据,保证了数据更新的频率。

全总实体类方案原理分外粗略,但实体类代码相比多,手写代码如故相比累,所以框架提供一个代码生成器,从数据库表生成实体类或者以团结修的SQL语句映射成实体类。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图