Skip to content

Commit 8175a98

Browse files
committed
code tweaks
1 parent 88e9f0c commit 8175a98

File tree

1 file changed

+34
-60
lines changed

1 file changed

+34
-60
lines changed

Fluid/Accessors/PropertyInfoAccessor.cs

+34-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,76 @@ 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+
foreach (var n in names)
6558
{
66-
return null;
67-
}
59+
var field = declaringType.GetField(n, BindingFlags.Instance | BindingFlags.NonPublic);
60+
if (field == null)
61+
{
62+
continue;
63+
}
6864

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

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

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

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

8180
private abstract class Invoker
8281
{
8382
public abstract object Invoke(object target);
8483
}
8584

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

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-
}
89+
public override object Invoke(object target) => _d((T) target);
9990
}
10091

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

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

116-
private sealed class Int32Invoker<T> : Invoker
99+
private sealed class Int32Invoker<T>(Delegate d) : Invoker
117100
{
118-
private readonly Func<T, int> _d;
101+
private readonly Func<T, int> _d = (Func<T, int>) d;
119102

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-
}
103+
public override object Invoke(object target) => NumberValue.Create(_d((T) target));
130104
}
131105
}
132106
}

0 commit comments

Comments
 (0)