在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
反射以及Attribute在ORM中的应用
一、 反射
public class Person { private string _Name; private int _Age; private string _Sex; public string Name { get { return this._Name; } set { this._Name = value; } } public int Age { get { return this._Age; } set { this._Age = value; } } public string Sex { get { return this._Sex; } set { this._Sex = value; } } }
测试代码如下: static class Program { [STAThread] static void Main() { Person person = new Person(); person.Name = "snoopy"; person.Age = 5; person.Sex = "male"; PropertyInfo[] infos = person.GetType().GetProperties(); Console.WriteLine("打印属性"); foreach (PropertyInfo info in infos) { //获取属性并打印 Console.WriteLine(info.Name + ":" + info.GetValue(person, null)); } Console.WriteLine("设置Person.Name = Hellokitty"); //设置属性,设置Name属性 foreach (PropertyInfo info in infos) { if (info.Name == "Name") { info.SetValue(person, "Hellokitty", null); } } Console.WriteLine("打印属性"); foreach (PropertyInfo info in infos) { //获取属性并打印 Console.WriteLine(info.Name + ":" + info.GetValue(person, null)); } Console.Read(); } } 上面演示了通过反射的方法来动态获取和设置对象属性的方法。但是这和ORM以及Attribute有什么关系呢?这个是我们接下来的这个部分的内容。
既然Attribute是类,那么她的定义方法和类就没有两样了,唯一的不同就是自定义Attribute类必须继承于System.Attribute。 public class DataFieldAttribute : Attribute { private string _FieldName; private string _FieldType; public DataFieldAttribute(string fieldname, string fieldtype) { this._FieldName = fieldname; this._FieldType = fieldtype; } public string FieldName { get { return this._FieldName; } set { this._FieldName = value; } } public string FieldType { get { return this._FieldType; } set { this._FieldType = value; } } } 好,我们有了自己的描述数据库字段的Attribute,那么我们现在将其应用到实际的类中。我们还是继续上面的Person类,使用方法如下: public class Person { private string _Name; private int _Age; private string _Sex; [DataFieldAttribute("name", "nvarchar")] public string Name { get { return this._Name; } set { this._Name = value; } } [DataFieldAttribute("age", "int")] public int Age { get { return this._Age; } set { this._Age = value; } } [DataFieldAttribute("sex", "nvarchar")] public string Sex { get { return this._Sex; } set { this._Sex = value; } } } 通过自定义Attribute,我们定义了类属性和数据库字段的一一对应关系,我们对Person类的Name、Age、Sex属性都加上了Attribute的描述,指定了他们对应的字段名以及类型,其中Person.Name对应于字段name,字段类型Nvarchar...。
三、反射和Attribute的联合使用。 static class Program { [STAThread] static void Main() { Person person = new Person(); person.Name = "snoopy"; person.Age = 5; person.Sex = "male"; PropertyInfo[] infos = person.GetType().GetProperties(); object[] objDataFieldAttribute = null; foreach (PropertyInfo info in infos) { objDataFieldAttribute = info.GetCustomAttributes(typeof(DataFieldAttribute), false); if (objDataFieldAttribute != null) { Console.WriteLine(info.Name + "->数据库字段:" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName); } } } } 哈哈,你是不是很想动手了啊?当然了如果你到了这一步就开始动手的话,那我就很高兴了,说明我的描述还算清楚(注:对于已经知道的大牛们此话无效)。也说明你很有动手的能力。因为接下来的工作就是怎样根据这种方法动态地从对象中获取映射规则,动态构造Insert,Update,Delete等语句。
四、本章总结
原文链接: C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用) 相关连接: C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)
|
请发表评论