Mercurial > pub > bltoolkit
diff Source/TypeBuilder/Builders/BuildContext.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/TypeBuilder/Builders/BuildContext.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Reflection.Emit; +using System.Diagnostics; + +using BLToolkit.Reflection; +using BLToolkit.Reflection.Emit; + +namespace BLToolkit.TypeBuilder.Builders +{ + [DebuggerStepThrough] + public class BuildContext + { + public BuildContext(Type type) + { + Type = type; + Items = new Dictionary<object,object>(10); + } + + public TypeHelper Type { get; private set; } + public AssemblyBuilderHelper AssemblyBuilder { get; set; } + public TypeBuilderHelper TypeBuilder { get; set; } + public Dictionary<object,object> Items { get; private set; } + + public T GetItem<T>(string key) + { + object value; + return Items.TryGetValue(key, out value) ? (T)value : default(T); + } + + private Dictionary<PropertyInfo,FieldBuilder> _fields; + public Dictionary<PropertyInfo,FieldBuilder> Fields + { + get { return _fields ?? (_fields = new Dictionary<PropertyInfo, FieldBuilder>(10)); } + } + + private IDictionary<TypeHelper,IAbstractTypeBuilder> _interfaceMap; + public IDictionary<TypeHelper,IAbstractTypeBuilder> InterfaceMap + { + get { return _interfaceMap ?? (_interfaceMap = new Dictionary<TypeHelper,IAbstractTypeBuilder>()); } + } + + public TypeHelper CurrentInterface { get; set; } + public MethodBuilderHelper MethodBuilder { get; set; } + public LocalBuilder ReturnValue { get; set; } + public LocalBuilder Exception { get; set; } + public Label ReturnLabel { get; set; } + + #region BuildElement + + public BuildElement BuildElement { get; set; } + + public bool IsAbstractGetter { get { return BuildElement == BuildElement.AbstractGetter; } } + public bool IsAbstractSetter { get { return BuildElement == BuildElement.AbstractSetter; } } + public bool IsAbstractProperty { get { return IsAbstractGetter || IsAbstractSetter; } } + public bool IsAbstractMethod { get { return BuildElement == BuildElement.AbstractMethod; } } + public bool IsVirtualGetter { get { return BuildElement == BuildElement.VirtualGetter; } } + public bool IsVirtualSetter { get { return BuildElement == BuildElement.VirtualSetter; } } + public bool IsVirtualProperty { get { return IsVirtualGetter || IsVirtualSetter; } } + public bool IsVirtualMethod { get { return BuildElement == BuildElement.VirtualMethod; } } + public bool IsGetter { get { return IsAbstractGetter || IsVirtualGetter; } } + public bool IsSetter { get { return IsAbstractSetter || IsVirtualSetter; } } + public bool IsProperty { get { return IsGetter || IsSetter; } } + public bool IsMethod { get { return IsAbstractMethod || IsVirtualMethod; } } + public bool IsMethodOrProperty { get { return IsMethod || IsProperty; } } + + #endregion + + #region BuildStep + + public BuildStep Step { get; set; } + + public bool IsBeginStep { get { return Step == BuildStep.Begin; } } + public bool IsBeforeStep { get { return Step == BuildStep.Before; } } + public bool IsBuildStep { get { return Step == BuildStep.Build; } } + public bool IsAfterStep { get { return Step == BuildStep.After; } } + public bool IsCatchStep { get { return Step == BuildStep.Catch; } } + public bool IsFinallyStep { get { return Step == BuildStep.Finally; } } + public bool IsEndStep { get { return Step == BuildStep.End; } } + + public bool IsBeforeOrBuildStep + { + get { return Step == BuildStep.Before || Step == BuildStep.Build; } + } + + #endregion + + public AbstractTypeBuilderList TypeBuilders { get; set; } + public PropertyInfo CurrentProperty { get; set; } + public MethodInfo CurrentMethod { get; set; } + + #region Internal Methods + + public FieldBuilder GetField(string fieldName) + { + return GetItem<FieldBuilder>("$BLToolkit.Field." + fieldName); + } + + public FieldBuilder CreateField(string fieldName, Type type, FieldAttributes attributes) + { + var field = TypeBuilder.DefineField(fieldName, type, attributes); + + field.SetCustomAttribute(MethodBuilder.Type.Assembly.BLToolkitAttribute); + + Items.Add("$BLToolkit.Field." + fieldName, field); + + return field; + } + + public FieldBuilder CreatePrivateField(string fieldName, Type type) + { + return CreateField(fieldName, type, FieldAttributes.Private); + } + + public FieldBuilder CreatePrivateField(PropertyInfo propertyInfo, string fieldName, Type type) + { + var field = CreateField(fieldName, type, FieldAttributes.Private); + + if (propertyInfo != null) + Fields.Add(propertyInfo, field); + + return field; + } + + public FieldBuilder CreatePrivateStaticField(string fieldName, Type type) + { + return CreateField(fieldName, type, FieldAttributes.Private | FieldAttributes.Static); + } + + public MethodBuilderHelper GetFieldInstanceEnsurer(string fieldName) + { + return GetItem<MethodBuilderHelper>("$BLToolkit.FieldInstanceEnsurer." + fieldName); + } + + #endregion + } +}