我实现了一个简单的EF框架,主要用于操纵数据库。实现了对数据库的基本操纵--CRUD
这是项目结构 这是一个 core 下的 DLL
写了一个数据库工厂,用于执行sql语句。调用sql语句工厂
写了一个sql语句工厂,用于生成sql语句。调用类型工厂
写了一个类型工厂,用于获取所需的类型,识别特性等。
appsettings.json是配置文件
最后一个是使用说明
我实现过程的首先从底层开始。
首先写的是类型工厂
结构
BaseTypeHelper.cs 是基础的类型帮助类
TypeHelperFactory.cs是一个工厂,调用BaseTypeHelper.cs,是现自己的功能,同时为sql语句工厂提供服务。
首先介绍一下BaseTypeHelper.cs类。这是代码。为TypeHelperFactory提供了必要的服务
1 public static class BaseTypeHelper 2 { 3 #region 获取单个成员 4 private static MemberInfo GetOneMember(Type t, string MemberName) 5 { 6 return GetAllMembers(t).FirstOrDefault(m => m.Name == MemberName); 7 } 8 9 #endregion 10 11 #region 获取所有成员 12 public static MemberInfo[] GetAllMembers(Type t) 13 { 14 return t.GetMembers(); 15 } 16 17 #endregion 18 19 #region 获取成员的属性 20 21 /// <summary> 22 /// 获取成员的属性 23 /// </summary> 24 /// <param name="obj">目标类</param> 25 /// <param name="MemberName">成员名称</param> 26 /// <returns></returns> 27 private static PropertyInfo GetProperty(object obj, string MemberName) 28 { 29 var type = obj.GetType(); 30 var member = GetOneMember(type, MemberName); 31 return type.GetProperty(member.Name); 32 33 } 34 #endregion 35 36 #region 执行法并返回结果 37 /// <summary> 38 /// 获取方法的返回值 39 /// </summary> 40 /// <param name="MethodName">方法的名称</param> 41 /// <param name="instance">实例</param> 42 /// <param name="param">参数列表,如果没有参数则置为null</param> 43 /// <returns></returns> 44 public static object GetMethodValue(string MethodName, object instance, params object[] param) 45 { 46 Type t = instance.GetType(); 47 try 48 { 49 MethodInfo info = t.GetMethod(MethodName); 50 return info.Invoke(instance, param); 51 } 52 catch (Exception e) 53 { 54 Console.WriteLine("方法没有找到," + e); 55 throw; 56 } 57 58 } 59 #endregion 60 61 #region 获取声明成员的类型 62 63 /// <summary> 64 /// 获取声明成员的类型 65 /// 说明:返回若为空则 没有找到 66 /// 若不为空,则查找正常 67 /// </summary> 68 /// <param name="MemberName">成员的名称</param> 69 /// <param name="t">所在类的类型</param> 70 /// <returns></returns> 71 public static string GetPropertyType(string MemberName, Type t) 72 { 73 MemberInfo member = GetOneMember(t, MemberName); 74 if (member != null) 75 { 76 PropertyInfo property = t.GetProperty(member.Name); 77 return property.PropertyType.Name; 78 } 79 return null; 80 81 } 82 #endregion 83 84 #region 获取单个成员是否含有某个属性 85 86 87 /// <summary> 88 /// 获取单个成员是否含有某个特性 89 /// </summary> 90 /// <param name="MemberName">成员的名称</param> 91 /// <param name="t">所在类的类型</param> 92 /// <param name="attribute">要获取的特性</param> 93 /// <returns></returns> 94 public static bool CustomAttributeExist(string MemberName, Type t, Attribute attribute) 95 { 96 97 var Member = GetOneMember(t, MemberName); 98 var My_customAttribute = Member.CustomAttributes.FirstOrDefault( 99 a => a.AttributeType == attribute.GetType()); 100 return My_customAttribute != null; 101 } 102 #endregion 103 104 #region 通过SetValue给成员设值 105 106 /// <summary> 107 /// 给成员设值 108 /// </summary> 109 /// <param name="obj">目标类</param> 110 /// <param name="MemberName">类内属性名称</param> 111 /// <param name="value">设置的值</param> 112 public static void SetValue(object obj, string MemberName, object value) 113 { 114 var Property = GetProperty(obj, MemberName); 115 Property.SetValue(obj, value); 116 } 117 #endregion 118 119 #region 通过GetValue给成员取值 120 121 /// <summary> 122 /// 取成员的值 123 /// </summary> 124 /// <param name="obj">目标类</param> 125 /// <param name="MemberName">成员的名称</param> 126 /// <returns></returns> 127 public static object GetValue(object obj, string MemberName) 128 { 129 var Property = GetProperty(obj, MemberName); 130 return Property.GetValue(obj); 131 } 132 #endregion 133 134 135 }