Skip to content

Commit 0b7fc9c

Browse files
committed
Added support for .NET 4.0
1 parent 8e102f7 commit 0b7fc9c

File tree

13 files changed

+79
-426
lines changed

13 files changed

+79
-426
lines changed

package.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<PropertyGroup>
99
<UnityAbstractionsVersion>4.0.0-RC1</UnityAbstractionsVersion>
10-
<TargetFrameworks>netstandard2.0;netstandard1.0;netcoreapp2.0;netcoreapp1.0;net47;net46;net45</TargetFrameworks>
10+
<TargetFrameworks>netstandard2.0;netstandard1.0;netcoreapp2.0;netcoreapp1.0;net47;net46;net45;net40</TargetFrameworks>
1111
</PropertyGroup>
1212

1313
</Project>

src/Builder/Context/BuilderContext.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public object Resolve(Type type, string name)
4747
var resolverOverride = Overrides[index];
4848

4949
// If matches with current parameter
50-
if (resolverOverride is IResolve resolverPolicy &&
50+
if (resolverOverride is IResolve resolverPolicy &&
5151
resolverOverride is IEquatable<(Type, string)> comparer && comparer.Equals((type, name)))
5252
{
5353
var context = this;
@@ -67,7 +67,7 @@ public object Resolve(Type type, string name)
6767

6868
public object Get(Type policyInterface)
6969
{
70-
return List.Get(RegistrationType, Name, policyInterface) ??
70+
return List.Get(RegistrationType, Name, policyInterface) ??
7171
Registration.Get(policyInterface);
7272
}
7373

@@ -115,9 +115,9 @@ public void Clear(Type type, string name, Type policyInterface)
115115
public SynchronizedLifetimeManager RequiresRecovery;
116116

117117
public bool BuildComplete;
118-
118+
#if !NET40
119119
public IntPtr Parent;
120-
120+
#endif
121121
public ExecutePlanDelegate ExecutePlan;
122122

123123
#endregion
@@ -140,7 +140,9 @@ public object Resolve(Type type, string name, InternalRegistration registration)
140140
ExecutePlan = ExecutePlan,
141141
List = List,
142142
Overrides = Overrides,
143+
#if !NET40
143144
Parent = new IntPtr(Unsafe.AsPointer(ref thisContext))
145+
#endif
144146
};
145147

146148
return ExecutePlan(registration.BuildChain, ref context);
@@ -181,7 +183,7 @@ public object Resolve(ParameterInfo parameter, object value)
181183
// Resolve from injectors
182184
switch (value)
183185
{
184-
case ParameterInfo info
186+
case ParameterInfo info
185187
when ReferenceEquals(info, parameter):
186188
return Resolve(parameter.ParameterType, null);
187189

@@ -278,7 +280,7 @@ public object Resolve(FieldInfo field, object value)
278280
return Resolve(field.FieldType, dependencyAttribute.Name);
279281

280282
case OptionalDependencyAttribute optionalAttribute:
281-
try { return Resolve(field.FieldType, optionalAttribute.Name); }
283+
try { return Resolve(field.FieldType, optionalAttribute.Name); }
282284
catch { return null; }
283285

284286
case ResolveDelegate<BuilderContext> resolver:

src/Processors/Abstracts/MemberProcessor.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,11 @@ public virtual IEnumerable<object> Select(Type type, IPolicySet registration)
194194
{
195195
for (var i = 0; i < AttributeFactories.Length; i++)
196196
{
197+
#if NET40
198+
if (!member.IsDefined(AttributeFactories[i].Type, true) ||
199+
#else
197200
if (!member.IsDefined(AttributeFactories[i].Type) ||
201+
#endif
198202
!memberSet.Add(member)) continue;
199203

200204
yield return member;
@@ -240,6 +244,13 @@ protected Attribute GetCustomAttribute(TMemberInfo info, Type type)
240244
.GetTypeInfo()
241245
.IsAssignableFrom(type.GetTypeInfo()))
242246
.FirstOrDefault();
247+
#elif NET40
248+
return info.GetCustomAttributes(true)
249+
.Cast<Attribute>()
250+
.Where(a => a.GetType()
251+
.GetTypeInfo()
252+
.IsAssignableFrom(type.GetTypeInfo()))
253+
.FirstOrDefault();
243254
#else
244255
return info.GetCustomAttribute(type);
245256
#endif

src/Processors/Constructor/ConstructorProcessor.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public ConstructorProcessor(IPolicySet policySet, Func<Type, bool> isTypeRegiste
3434
#region Public Properties
3535

3636
public Func<Type, ConstructorInfo[], object> SelectMethod { get; set; }
37-
37+
3838
#endregion
3939

4040

@@ -64,7 +64,11 @@ public override IEnumerable<object> Select(Type type, IPolicySet registration)
6464
{
6565
for (var i = 0; i < AttributeFactories.Length; i++)
6666
{
67+
#if NET40
68+
if (!constructor.IsDefined(AttributeFactories[i].Type, true))
69+
#else
6770
if (!constructor.IsDefined(AttributeFactories[i].Type))
71+
#endif
6872
continue;
6973

7074
return new[] { constructor };
@@ -155,8 +159,9 @@ private object SmartSelector(Type type, ConstructorInfo[] constructors)
155159

156160
if (null != bestCtor && parametersCount > parameters.Length) return bestCtor;
157161
parametersCount = parameters.Length;
162+
158163
#if NET40
159-
if (parameters.All(p => _container.CanResolve(p.ParameterType) || null != p.DefaultValue && !(p.DefaultValue is DBNull)))
164+
if (parameters.All(p => (null != p.DefaultValue && !(p.DefaultValue is DBNull)) || CanResolve(p.ParameterType)))
160165
#else
161166
if (parameters.All(p => p.HasDefaultValue || CanResolve(p.ParameterType)))
162167
#endif
@@ -201,7 +206,11 @@ private object SmartSelector(Type type, ConstructorInfo[] constructors)
201206

202207
private bool CanResolve(Type type)
203208
{
209+
#if NETSTANDARD1_0 || NETCOREAPP1_0
204210
var info = type.GetTypeInfo();
211+
#else
212+
var info = type;
213+
#endif
205214

206215
if (info.IsClass)
207216
{

src/Processors/Parameters/ParametersDiagnostic.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Linq.Expressions;
44
using System.Reflection;
55
using Unity.Builder;
6-
using Unity.Policy;
76
using Unity.Resolution;
87

98
namespace Unity.Processors
@@ -23,11 +22,17 @@ protected virtual IEnumerable<Expression> CreateDiagnosticParameterExpressions(P
2322
: PreProcessResolver(parameter, resolvers[i]);
2423

2524
// Check if has default value
25+
26+
#if NET40
27+
Expression defaultValueExpr = null;
28+
if (true)
29+
#else
2630
var defaultValueExpr = parameter.HasDefaultValue
2731
? Expression.Constant(parameter.DefaultValue, parameter.ParameterType)
2832
: null;
2933

3034
if (!parameter.HasDefaultValue)
35+
#endif
3136
{
3237
var ex = Expression.Variable(typeof(Exception));
3338
var exData = Expression.MakeMemberAccess(ex, DataProperty);
@@ -81,7 +86,11 @@ protected virtual IEnumerable<ResolveDelegate<BuilderContext>> CreateDiagnosticP
8186
// TODO: Add diagnostic for parameters
8287

8388
// Check if has default value
89+
#if NET40
90+
if (parameter.DefaultValue is DBNull)
91+
#else
8492
if (!parameter.HasDefaultValue)
93+
#endif
8594
{
8695
// Plain vanilla case
8796
yield return (ref BuilderContext context) =>
@@ -100,7 +109,11 @@ protected virtual IEnumerable<ResolveDelegate<BuilderContext>> CreateDiagnosticP
100109
else
101110
{
102111
// Check if has default value
112+
#if NET40
113+
var defaultValue = !(parameter.DefaultValue is DBNull) ? parameter.DefaultValue : null;
114+
#else
103115
var defaultValue = parameter.HasDefaultValue ? parameter.DefaultValue : null;
116+
#endif
104117
yield return (ref BuilderContext context) =>
105118
{
106119
try

src/Processors/Parameters/ParametersProcessor.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,19 @@ protected virtual IEnumerable<Expression> CreateParameterExpressions(ParameterIn
4141
: PreProcessResolver(parameter, resolvers[i]);
4242

4343
// Check if has default value
44+
#if NET40
45+
var defaultValueExpr = parameter.DefaultValue is DBNull
46+
? Expression.Constant(parameter.DefaultValue, parameter.ParameterType)
47+
: null;
48+
49+
if (parameter.DefaultValue is DBNull)
50+
#else
4451
var defaultValueExpr = parameter.HasDefaultValue
4552
? Expression.Constant(parameter.DefaultValue, parameter.ParameterType)
4653
: null;
4754

4855
if (!parameter.HasDefaultValue)
56+
#endif
4957
{
5058
// Plain vanilla case
5159
yield return Expression.Convert(
@@ -91,17 +99,23 @@ protected virtual IEnumerable<ResolveDelegate<BuilderContext>> CreateParameterRe
9199
var resolver = null == resolvers
92100
? FromAttribute(parameter)
93101
: PreProcessResolver(parameter, resolvers[i]);
94-
102+
#if NET40
103+
if (parameter.DefaultValue is DBNull)
104+
#else
95105
if (!parameter.HasDefaultValue)
106+
#endif
96107
{
97108
// Plain vanilla case
98109
yield return (ref BuilderContext context) => context.Resolve(parameter, resolver);
99110
}
100111
else
101112
{
102113
// Check if has default value
114+
#if NET40
115+
var defaultValue = !(parameter.DefaultValue is DBNull) ? parameter.DefaultValue : null;
116+
#else
103117
var defaultValue = parameter.HasDefaultValue ? parameter.DefaultValue : null;
104-
118+
#endif
105119
yield return (ref BuilderContext context) =>
106120
{
107121
try
@@ -142,7 +156,11 @@ private object PreProcessResolver(ParameterInfo parameter, object resolver)
142156

143157
private object FromAttribute(ParameterInfo info)
144158
{
159+
#if NET40
160+
var defaultValue = !(info.DefaultValue is DBNull) ? info.DefaultValue : null;
161+
#else
145162
var defaultValue = info.HasDefaultValue ? info.DefaultValue : null;
163+
#endif
146164
foreach (var node in AttributeFactories)
147165
{
148166
if (null == node.Factory) continue;

src/Processors/Properties/PropertyDiagnostic.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ protected override ResolveDelegate<BuilderContext> GetResolverDelegate(PropertyI
4343
{
4444
try
4545
{
46+
#if NET40
47+
info.SetValue(context.Existing, context.Resolve(info, value), null);
48+
#else
4649
info.SetValue(context.Existing, context.Resolve(info, value));
50+
#endif
4751
return context.Existing;
4852
}
4953
catch (Exception ex)

src/Processors/Properties/PropertyProcessor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ protected override ResolveDelegate<BuilderContext> GetResolverDelegate(PropertyI
7575
var value = PreProcessResolver(info, resolver);
7676
return (ref BuilderContext context) =>
7777
{
78+
#if NET40
79+
info.SetValue(context.Existing, context.Resolve(info, value), null);
80+
#else
7881
info.SetValue(context.Existing, context.Resolve(info, value));
82+
#endif
7983
return context.Existing;
8084
};
8185
}

0 commit comments

Comments
 (0)