Skip to content

Commit 89a7e90

Browse files
committed
code tweaks
1 parent 88e9f0c commit 89a7e90

File tree

1 file changed

+35
-60
lines changed

1 file changed

+35
-60
lines changed

Fluid/Accessors/PropertyInfoAccessor.cs

+35-60
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public PropertyInfoAccessor(PropertyInfo propertyInfo)
1212
{
1313
Delegate d;
1414

15-
if (!propertyInfo.DeclaringType.IsValueType)
15+
if (!propertyInfo.DeclaringType?.IsValueType == true)
1616
{
1717
var delegateType = typeof(Func<,>).MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType);
1818
d = propertyInfo.GetGetMethod().CreateDelegate(delegateType);
@@ -31,102 +31,77 @@ public PropertyInfoAccessor(PropertyInfo propertyInfo)
3131
_invoker = null;
3232
}
3333

34+
Type invokerType;
3435
if (propertyInfo.PropertyType == typeof(bool))
3536
{
36-
var invokerType = typeof(BooleanInvoker<>).MakeGenericType(propertyInfo.DeclaringType);
37-
_invoker = (Invoker) Activator.CreateInstance(invokerType, [d]);
37+
invokerType = typeof(BooleanInvoker<>).MakeGenericType(propertyInfo.DeclaringType);
3838
}
3939
else if (propertyInfo.PropertyType == typeof(int))
4040
{
41-
var invokerType = typeof(Int32Invoker<>).MakeGenericType(propertyInfo.DeclaringType);
42-
_invoker = (Invoker) Activator.CreateInstance(invokerType, [d]);
41+
invokerType = typeof(Int32Invoker<>).MakeGenericType(propertyInfo.DeclaringType);
4342
}
4443
else
4544
{
46-
var invokerType = typeof(Invoker<,>).MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType);
47-
_invoker = (Invoker) Activator.CreateInstance(invokerType, [d]);
45+
invokerType = typeof(Invoker<,>).MakeGenericType(propertyInfo.DeclaringType, propertyInfo.PropertyType);
4846
}
49-
}
5047

51-
public object Get(object obj, string name, TemplateContext ctx)
52-
{
53-
return _invoker?.Invoke(obj);
48+
_invoker = (Invoker) Activator.CreateInstance(invokerType, [d]);
5449
}
5550

51+
public object Get(object obj, string name, TemplateContext ctx) => _invoker?.Invoke(obj);
52+
5653
private static Delegate GetGetter(Type declaringType, string fieldName)
5754
{
58-
string[] names = [fieldName.ToLowerInvariant(), $"<{fieldName}>k__BackingField", "_" + fieldName.ToLowerInvariant()];
55+
string[] names = [fieldName.ToLowerInvariant(), $"<{fieldName}>k__BackingField", $"_{fieldName.ToLowerInvariant()}"];
5956

60-
var field = names
61-
.Select(n => declaringType.GetField(n, BindingFlags.Instance | BindingFlags.NonPublic))
62-
.FirstOrDefault(x => x != null);
63-
64-
if (field == null)
57+
FieldInfo field = null;
58+
foreach (var n in names)
6559
{
66-
return null;
67-
}
60+
var x = declaringType.GetField(n, BindingFlags.Instance | BindingFlags.NonPublic);
61+
if (x == null)
62+
{
63+
continue;
64+
}
6865

69-
var parameterTypes = new[] { typeof(object), declaringType };
66+
var parameterTypes = new[] { typeof(object), declaringType };
7067

71-
var method = new DynamicMethod(fieldName + "Get", field.FieldType, parameterTypes, typeof(PropertyInfoAccessor).Module, true);
68+
var method = new DynamicMethod(fieldName + "Get", field.FieldType, parameterTypes, typeof(PropertyInfoAccessor).Module, true);
7269

73-
var emitter = method.GetILGenerator();
74-
emitter.Emit(OpCodes.Ldarg_1);
75-
emitter.Emit(OpCodes.Ldfld, field);
76-
emitter.Emit(OpCodes.Ret);
70+
var emitter = method.GetILGenerator();
71+
emitter.Emit(OpCodes.Ldarg_1);
72+
emitter.Emit(OpCodes.Ldfld, field);
73+
emitter.Emit(OpCodes.Ret);
7774

78-
return method.CreateDelegate(typeof(Func<,>).MakeGenericType(declaringType, field.FieldType));
75+
return method.CreateDelegate(typeof(Func<,>).MakeGenericType(declaringType, field.FieldType));
76+
}
77+
78+
return null;
7979
}
8080

8181
private abstract class Invoker
8282
{
8383
public abstract object Invoke(object target);
8484
}
8585

86-
private sealed class Invoker<T, TResult> : Invoker
86+
private sealed class Invoker<T, TResult>(Delegate d) : Invoker
8787
{
88-
private readonly Func<T, TResult> _d;
88+
private readonly Func<T, TResult> _d = (Func<T, TResult>) d;
8989

90-
public Invoker(Delegate d)
91-
{
92-
_d = (Func<T, TResult>)d;
93-
}
94-
95-
public override object Invoke(object target)
96-
{
97-
return _d((T)target);
98-
}
90+
public override object Invoke(object target) => _d((T) target);
9991
}
10092

101-
private sealed class BooleanInvoker<T> : Invoker
93+
private sealed class BooleanInvoker<T>(Delegate d) : Invoker
10294
{
103-
private readonly Func<T, bool> _d;
104-
105-
public BooleanInvoker(Delegate d)
106-
{
107-
_d = (Func<T, bool>)d;
108-
}
95+
private readonly Func<T, bool> _d = (Func<T, bool>) d;
10996

110-
public override object Invoke(object target)
111-
{
112-
return _d((T)target) ? BooleanValue.True : BooleanValue.False;
113-
}
97+
public override object Invoke(object target) => _d((T) target) ? BooleanValue.True : BooleanValue.False;
11498
}
11599

116-
private sealed class Int32Invoker<T> : Invoker
100+
private sealed class Int32Invoker<T>(Delegate d) : Invoker
117101
{
118-
private readonly Func<T, int> _d;
102+
private readonly Func<T, int> _d = (Func<T, int>) d;
119103

120-
public Int32Invoker(Delegate d)
121-
{
122-
_d = (Func<T, int>)d;
123-
}
124-
125-
public override object Invoke(object target)
126-
{
127-
var value = _d((T)target);
128-
return NumberValue.Create(value);
129-
}
104+
public override object Invoke(object target) => NumberValue.Create(_d((T) target));
130105
}
131106
}
132107
}

0 commit comments

Comments
 (0)