Mercurial > pub > bltoolkit
comparison Source/TypeBuilder/Builders/BuildContext.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Reflection; | |
| 4 using System.Reflection.Emit; | |
| 5 using System.Diagnostics; | |
| 6 | |
| 7 using BLToolkit.Reflection; | |
| 8 using BLToolkit.Reflection.Emit; | |
| 9 | |
| 10 namespace BLToolkit.TypeBuilder.Builders | |
| 11 { | |
| 12 [DebuggerStepThrough] | |
| 13 public class BuildContext | |
| 14 { | |
| 15 public BuildContext(Type type) | |
| 16 { | |
| 17 Type = type; | |
| 18 Items = new Dictionary<object,object>(10); | |
| 19 } | |
| 20 | |
| 21 public TypeHelper Type { get; private set; } | |
| 22 public AssemblyBuilderHelper AssemblyBuilder { get; set; } | |
| 23 public TypeBuilderHelper TypeBuilder { get; set; } | |
| 24 public Dictionary<object,object> Items { get; private set; } | |
| 25 | |
| 26 public T GetItem<T>(string key) | |
| 27 { | |
| 28 object value; | |
| 29 return Items.TryGetValue(key, out value) ? (T)value : default(T); | |
| 30 } | |
| 31 | |
| 32 private Dictionary<PropertyInfo,FieldBuilder> _fields; | |
| 33 public Dictionary<PropertyInfo,FieldBuilder> Fields | |
| 34 { | |
| 35 get { return _fields ?? (_fields = new Dictionary<PropertyInfo, FieldBuilder>(10)); } | |
| 36 } | |
| 37 | |
| 38 private IDictionary<TypeHelper,IAbstractTypeBuilder> _interfaceMap; | |
| 39 public IDictionary<TypeHelper,IAbstractTypeBuilder> InterfaceMap | |
| 40 { | |
| 41 get { return _interfaceMap ?? (_interfaceMap = new Dictionary<TypeHelper,IAbstractTypeBuilder>()); } | |
| 42 } | |
| 43 | |
| 44 public TypeHelper CurrentInterface { get; set; } | |
| 45 public MethodBuilderHelper MethodBuilder { get; set; } | |
| 46 public LocalBuilder ReturnValue { get; set; } | |
| 47 public LocalBuilder Exception { get; set; } | |
| 48 public Label ReturnLabel { get; set; } | |
| 49 | |
| 50 #region BuildElement | |
| 51 | |
| 52 public BuildElement BuildElement { get; set; } | |
| 53 | |
| 54 public bool IsAbstractGetter { get { return BuildElement == BuildElement.AbstractGetter; } } | |
| 55 public bool IsAbstractSetter { get { return BuildElement == BuildElement.AbstractSetter; } } | |
| 56 public bool IsAbstractProperty { get { return IsAbstractGetter || IsAbstractSetter; } } | |
| 57 public bool IsAbstractMethod { get { return BuildElement == BuildElement.AbstractMethod; } } | |
| 58 public bool IsVirtualGetter { get { return BuildElement == BuildElement.VirtualGetter; } } | |
| 59 public bool IsVirtualSetter { get { return BuildElement == BuildElement.VirtualSetter; } } | |
| 60 public bool IsVirtualProperty { get { return IsVirtualGetter || IsVirtualSetter; } } | |
| 61 public bool IsVirtualMethod { get { return BuildElement == BuildElement.VirtualMethod; } } | |
| 62 public bool IsGetter { get { return IsAbstractGetter || IsVirtualGetter; } } | |
| 63 public bool IsSetter { get { return IsAbstractSetter || IsVirtualSetter; } } | |
| 64 public bool IsProperty { get { return IsGetter || IsSetter; } } | |
| 65 public bool IsMethod { get { return IsAbstractMethod || IsVirtualMethod; } } | |
| 66 public bool IsMethodOrProperty { get { return IsMethod || IsProperty; } } | |
| 67 | |
| 68 #endregion | |
| 69 | |
| 70 #region BuildStep | |
| 71 | |
| 72 public BuildStep Step { get; set; } | |
| 73 | |
| 74 public bool IsBeginStep { get { return Step == BuildStep.Begin; } } | |
| 75 public bool IsBeforeStep { get { return Step == BuildStep.Before; } } | |
| 76 public bool IsBuildStep { get { return Step == BuildStep.Build; } } | |
| 77 public bool IsAfterStep { get { return Step == BuildStep.After; } } | |
| 78 public bool IsCatchStep { get { return Step == BuildStep.Catch; } } | |
| 79 public bool IsFinallyStep { get { return Step == BuildStep.Finally; } } | |
| 80 public bool IsEndStep { get { return Step == BuildStep.End; } } | |
| 81 | |
| 82 public bool IsBeforeOrBuildStep | |
| 83 { | |
| 84 get { return Step == BuildStep.Before || Step == BuildStep.Build; } | |
| 85 } | |
| 86 | |
| 87 #endregion | |
| 88 | |
| 89 public AbstractTypeBuilderList TypeBuilders { get; set; } | |
| 90 public PropertyInfo CurrentProperty { get; set; } | |
| 91 public MethodInfo CurrentMethod { get; set; } | |
| 92 | |
| 93 #region Internal Methods | |
| 94 | |
| 95 public FieldBuilder GetField(string fieldName) | |
| 96 { | |
| 97 return GetItem<FieldBuilder>("$BLToolkit.Field." + fieldName); | |
| 98 } | |
| 99 | |
| 100 public FieldBuilder CreateField(string fieldName, Type type, FieldAttributes attributes) | |
| 101 { | |
| 102 var field = TypeBuilder.DefineField(fieldName, type, attributes); | |
| 103 | |
| 104 field.SetCustomAttribute(MethodBuilder.Type.Assembly.BLToolkitAttribute); | |
| 105 | |
| 106 Items.Add("$BLToolkit.Field." + fieldName, field); | |
| 107 | |
| 108 return field; | |
| 109 } | |
| 110 | |
| 111 public FieldBuilder CreatePrivateField(string fieldName, Type type) | |
| 112 { | |
| 113 return CreateField(fieldName, type, FieldAttributes.Private); | |
| 114 } | |
| 115 | |
| 116 public FieldBuilder CreatePrivateField(PropertyInfo propertyInfo, string fieldName, Type type) | |
| 117 { | |
| 118 var field = CreateField(fieldName, type, FieldAttributes.Private); | |
| 119 | |
| 120 if (propertyInfo != null) | |
| 121 Fields.Add(propertyInfo, field); | |
| 122 | |
| 123 return field; | |
| 124 } | |
| 125 | |
| 126 public FieldBuilder CreatePrivateStaticField(string fieldName, Type type) | |
| 127 { | |
| 128 return CreateField(fieldName, type, FieldAttributes.Private | FieldAttributes.Static); | |
| 129 } | |
| 130 | |
| 131 public MethodBuilderHelper GetFieldInstanceEnsurer(string fieldName) | |
| 132 { | |
| 133 return GetItem<MethodBuilderHelper>("$BLToolkit.FieldInstanceEnsurer." + fieldName); | |
| 134 } | |
| 135 | |
| 136 #endregion | |
| 137 } | |
| 138 } |
