123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- using System.Reflection;
- using System;
- using Ant.DbExpressions;
- using System.Threading;
- using Ant.Core;
- using Ant.Core.Emit;
- using Ant.ORM;
- namespace Ant.Descriptors
- {
- public class FieldDescriptor : MappingMemberDescriptor
- {
- FieldInfo _fieldInfo;
- DbColumn _column;
- Func<object, object> _valueGetter = null;
- Action<object, object> _valueSetter = null;
- public FieldDescriptor(FieldInfo fieldInfo, FiledMetaData declaringEntityDescriptor, string columnName)
- : base(declaringEntityDescriptor)
- {
- this._fieldInfo = fieldInfo;
- this._column = new DbColumn(columnName, fieldInfo.FieldType);
- }
- /// <summary>
- /// 获取有关成员特性的信息并提供对成员元数据的访问
- /// </summary>
- public override MemberInfo MemberInfo
- {
- get { return this._fieldInfo; }
- }
- /// <summary>
- /// 表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型
- /// </summary>
- public override Type MemberInfoType
- {
- get { return this._fieldInfo.FieldType; }
- }
- /// <summary>
- /// 标记每个已定义为 MemberInfo 的派生类的成员类型
- /// </summary>
- public override MemberTypes MemberType
- {
- get { return MemberTypes.Field; }
- }
- public override DbColumn Column
- {
- get { return this._column; }
- }
- /// <summary>
- /// 获取列的值
- /// </summary>
- /// <param name="instance"></param>
- /// <returns></returns>
- public override object GetValue(object instance)
- {
- if (null == this._valueGetter)
- {
- if (Monitor.TryEnter(this))
- {
- try
- {
- if (null == this._valueGetter)
- {
- this._valueGetter = DelegateGenerator.CreateValueGetter(this._fieldInfo);
- }
- }
- finally
- {
- Monitor.Exit(this);
- }
- }
- else
- {
- return this._fieldInfo.GetValue(instance);
- }
- }
- return this._valueGetter(instance);
- }
- /// <summary>
- /// 给列进行赋值
- /// </summary>
- /// <param name="instance"></param>
- /// <param name="value"></param>
- public override void SetValue(object instance, object value)
- {
- if (null == this._valueSetter)
- {
- if (Monitor.TryEnter(this))
- {
- try
- {
- if (null == this._valueSetter)
- {
- this._valueSetter = DelegateGenerator.CreateValueSetter(this._fieldInfo);
- }
- }
- finally
- {
- Monitor.Exit(this);
- }
- }
- else
- {
- this._fieldInfo.SetValue(instance, value);
- return;
- }
- }
- this._valueSetter(instance, value);
- }
- }
- }
|