0
|
1 using System;
|
|
2 using System.Diagnostics.CodeAnalysis;
|
|
3
|
|
4 using BLToolkit.Reflection;
|
|
5
|
|
6 namespace BLToolkit.TypeBuilder
|
|
7 {
|
|
8 ///<summary>
|
|
9 /// Specifies a value holder type.
|
|
10 ///</summary>
|
|
11 [SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
|
|
12 [AttributeUsage(AttributeTargets.Property)]
|
|
13 public class InstanceTypeAttribute : Builders.AbstractTypeBuilderAttribute
|
|
14 {
|
|
15 ///<summary>
|
|
16 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
17 ///</summary>
|
|
18 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
19 public InstanceTypeAttribute(Type instanceType)
|
|
20 {
|
|
21 _instanceType = instanceType;
|
|
22 }
|
|
23
|
|
24 ///<summary>
|
|
25 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
26 ///</summary>
|
|
27 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
28 ///<param name="parameter1">An additional parameter.</param>
|
|
29 ///<seealso cref="Parameters"/>
|
|
30 public InstanceTypeAttribute(Type instanceType, object parameter1)
|
|
31 {
|
|
32 _instanceType = instanceType;
|
|
33 SetParameters(parameter1);
|
|
34 }
|
|
35
|
|
36 ///<summary>
|
|
37 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
38 ///</summary>
|
|
39 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
40 ///<param name="parameter1">An additional parameter.</param>
|
|
41 ///<param name="parameter2">An additional parameter.</param>
|
|
42 ///<seealso cref="Parameters"/>
|
|
43 public InstanceTypeAttribute(Type instanceType,
|
|
44 object parameter1,
|
|
45 object parameter2)
|
|
46 {
|
|
47 _instanceType = instanceType;
|
|
48 SetParameters(parameter1, parameter2);
|
|
49 }
|
|
50
|
|
51 ///<summary>
|
|
52 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
53 ///</summary>
|
|
54 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
55 ///<param name="parameter1">An additional parameter.</param>
|
|
56 ///<param name="parameter2">An additional parameter.</param>
|
|
57 ///<param name="parameter3">An additional parameter.</param>
|
|
58 ///<seealso cref="Parameters"/>
|
|
59 public InstanceTypeAttribute(Type instanceType,
|
|
60 object parameter1,
|
|
61 object parameter2,
|
|
62 object parameter3)
|
|
63 {
|
|
64 _instanceType = instanceType;
|
|
65 SetParameters(parameter1, parameter2, parameter3);
|
|
66 }
|
|
67
|
|
68 ///<summary>
|
|
69 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
70 ///</summary>
|
|
71 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
72 ///<param name="parameter1">An additional parameter.</param>
|
|
73 ///<param name="parameter2">An additional parameter.</param>
|
|
74 ///<param name="parameter3">An additional parameter.</param>
|
|
75 ///<param name="parameter4">An additional parameter.</param>
|
|
76 ///<seealso cref="Parameters"/>
|
|
77 public InstanceTypeAttribute(Type instanceType,
|
|
78 object parameter1,
|
|
79 object parameter2,
|
|
80 object parameter3,
|
|
81 object parameter4)
|
|
82 {
|
|
83 _instanceType = instanceType;
|
|
84 SetParameters(parameter1, parameter2, parameter3, parameter4);
|
|
85 }
|
|
86
|
|
87 ///<summary>
|
|
88 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
89 ///</summary>
|
|
90 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
91 ///<param name="parameter1">An additional parameter.</param>
|
|
92 ///<param name="parameter2">An additional parameter.</param>
|
|
93 ///<param name="parameter3">An additional parameter.</param>
|
|
94 ///<param name="parameter4">An additional parameter.</param>
|
|
95 ///<param name="parameter5">An additional parameter.</param>
|
|
96 ///<seealso cref="Parameters"/>
|
|
97 public InstanceTypeAttribute(Type instanceType,
|
|
98 object parameter1,
|
|
99 object parameter2,
|
|
100 object parameter3,
|
|
101 object parameter4,
|
|
102 object parameter5)
|
|
103 {
|
|
104 _instanceType = instanceType;
|
|
105 SetParameters(parameter1, parameter2, parameter3, parameter4, parameter5);
|
|
106 }
|
|
107
|
|
108 ///<summary>
|
|
109 /// Initializes a new instance of the InstanceTypeAttribute class.
|
|
110 ///</summary>
|
|
111 ///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
|
|
112 ///<param name="parameter1">An additional parameter.</param>
|
|
113 ///<param name="parameters">More additional parameters.</param>
|
|
114 ///<seealso cref="Parameters"/>
|
|
115 public InstanceTypeAttribute(Type instanceType, object parameter1, params object[] parameters)
|
|
116 {
|
|
117 _instanceType = instanceType;
|
|
118
|
|
119 // Note: we can not use something like
|
|
120 // public InstanceTypeAttribute(Type instanceType, params object[] parameters)
|
|
121 // because [InstanceType(typeof(Foo), new object[] {1,2,3})] will be treated as
|
|
122 // [InstanceType(typeof(Foo), 1, 2, 3)] so it will be not possible to specify
|
|
123 // an instance type with array as the type of the one and only parameter.
|
|
124 // An extra parameter of type object made it successul.
|
|
125
|
|
126 int len = parameters.Length;
|
|
127 Array.Resize(ref parameters, len + 1);
|
|
128 Array.ConstrainedCopy(parameters, 0, parameters, 1, len);
|
|
129 parameters[0] = parameter1;
|
|
130
|
|
131 SetParameters(parameters);
|
|
132 }
|
|
133
|
|
134 protected void SetParameters(params object[] parameters)
|
|
135 {
|
|
136 _parameters = parameters;
|
|
137 }
|
|
138
|
|
139 private object[] _parameters;
|
|
140 ///<summary>
|
|
141 /// Any additional parameters passed to a value holder constructor
|
|
142 /// with <see cref="InitContext"/> parameter.
|
|
143 ///</summary>
|
|
144 public object[] Parameters
|
|
145 {
|
|
146 get { return _parameters; }
|
|
147 }
|
|
148
|
|
149 private readonly Type _instanceType;
|
|
150 protected Type InstanceType
|
|
151 {
|
|
152 get { return _instanceType; }
|
|
153 }
|
|
154
|
|
155 private bool _isObjectHolder;
|
|
156 ///<summary>
|
|
157 /// False (default value) for holders for scalar types,
|
|
158 /// true for holders for complex objects.
|
|
159 ///</summary>
|
|
160 public bool IsObjectHolder
|
|
161 {
|
|
162 get { return _isObjectHolder; }
|
|
163 set { _isObjectHolder = value; }
|
|
164 }
|
|
165
|
|
166 private Builders.IAbstractTypeBuilder _typeBuilder;
|
|
167 ///<summary>
|
|
168 /// An <see cref="Builders.IAbstractTypeBuilder"/> required for this attribute
|
|
169 /// to build an abstract type inheritor.
|
|
170 ///</summary>
|
|
171 public override Builders.IAbstractTypeBuilder TypeBuilder
|
|
172 {
|
|
173 get
|
|
174 {
|
|
175 return _typeBuilder ?? (_typeBuilder =
|
|
176 new Builders.InstanceTypeBuilder(_instanceType, _isObjectHolder));
|
|
177 }
|
|
178 }
|
|
179 }
|
|
180 }
|