Skip to content

Commit fae3915

Browse files
committed
Method call translation performance improvement
1 parent b7b98a9 commit fae3915

File tree

5 files changed

+21
-22
lines changed

5 files changed

+21
-22
lines changed

ReadableExpressions/Extensions/ReflectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
namespace AgileObjects.ReadableExpressions.Extensions
22
{
3+
using System.Diagnostics;
34
using System.Reflection;
45
using System.Runtime.CompilerServices;
56

67
internal static class ReflectionExtensions
78
{
9+
[DebuggerStepThrough]
810
public static bool IsExtensionMethod(this MethodInfo method)
911
{
1012
return method.IsStatic && method.IsDefined(typeof(ExtensionAttribute), false);

ReadableExpressions/Translators/BclMethodInfoWrapper.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ namespace AgileObjects.ReadableExpressions.Translators
22
{
33
using System;
44
using System.Collections.Generic;
5-
using System.Linq;
5+
using System.Diagnostics;
66
using System.Reflection;
77
using Extensions;
88

99
internal class BclMethodInfoWrapper : IMethodInfo
1010
{
1111
private readonly MethodInfo _method;
12-
private IEnumerable<Type> _genericArguments;
12+
private Type[] _genericArguments;
1313

14-
public BclMethodInfoWrapper(MethodInfo method, IEnumerable<Type> genericArguments = null)
14+
[DebuggerStepThrough]
15+
public BclMethodInfoWrapper(MethodInfo method, Type[] genericArguments = null)
1516
{
1617
_method = method;
1718
_genericArguments = genericArguments;
@@ -26,16 +27,19 @@ public BclMethodInfoWrapper(MethodInfo method, IEnumerable<Type> genericArgument
2627

2728
public MethodInfo GetGenericMethodDefinition() => _method.GetGenericMethodDefinition();
2829

29-
public IEnumerable<Type> GetGenericArguments() =>
30+
public IEnumerable<Type> GetGenericArguments() => GetGenericArgumentsArray();
31+
32+
private Type[] GetGenericArgumentsArray() =>
3033
(_genericArguments ?? (_genericArguments = _method.GetGenericArguments()));
3134

3235
public IEnumerable<ParameterInfo> GetParameters() => _method.GetParameters();
3336

3437
public Type GetGenericArgumentFor(Type parameterType)
3538
{
36-
var parameterIndex = Array.IndexOf(_method.GetGenericArguments(), parameterType, 0);
39+
var genericArguments = GetGenericArgumentsArray();
40+
var parameterIndex = Array.IndexOf(genericArguments, parameterType, 0);
3741

38-
return _genericArguments.ElementAt(parameterIndex);
42+
return genericArguments[parameterIndex];
3943
}
4044
}
4145
}

ReadableExpressions/Translators/DynamicExpressionTranslator.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,11 @@ public override string Translate(Expression expression, TranslationContext conte
4040
// way to go.
4141
foreach (var translator in _translators)
4242
{
43-
string translated;
44-
4543
if (translator.TryTranslate(
4644
operationDescription,
4745
dynamicExpression,
4846
context,
49-
out translated))
47+
out var translated))
5048
{
5149
return translated;
5250
}
@@ -201,7 +199,7 @@ private static IMethodInfo GetMethodInfo(
201199
GetGenericArgumentsOrNull(method, methodArguments, methodReturnType));
202200
}
203201

204-
private static IEnumerable<Type> GetGenericArgumentsOrNull(
202+
private static Type[] GetGenericArgumentsOrNull(
205203
MethodInfo method,
206204
Expression[] methodArguments,
207205
Type methodReturnType)

ReadableExpressions/Translators/Formatting/FormattableExpressionBase.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace AgileObjects.ReadableExpressions.Translators.Formatting
44

55
internal abstract class FormattableExpressionBase
66
{
7+
private const int MaxLineLength = 100;
8+
79
public static implicit operator string(FormattableExpressionBase expression)
810
{
911
return expression.ToString();
@@ -24,7 +26,7 @@ protected string GetFormattedTranslation()
2426

2527
protected virtual bool SplitToMultipleLines(string translation)
2628
{
27-
return (translation.Length > 100) || translation.IsMultiLine();
29+
return (translation.Length > MaxLineLength) || translation.IsMultiLine();
2830
}
2931

3032
public override string ToString()

ReadableExpressions/Translators/MethodCallExpressionTranslator.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ public override string Translate(Expression expression, TranslationContext conte
3333
}
3434

3535
var methodCall = (MethodCallExpression)expression;
36-
IEnumerable<Expression> methodArguments;
37-
var methodCallSubject = GetMethodCallSubject(methodCall, context, out methodArguments);
36+
var methodCallSubject = GetMethodCallSubject(methodCall, context, out var methodArguments);
3837

3938
return GetMethodCall(
4039
methodCallSubject,
@@ -46,9 +45,8 @@ public override string Translate(Expression expression, TranslationContext conte
4645

4746
public static string GetMethodCallSubject(MethodCallExpression methodCall, TranslationContext context)
4847
{
49-
IEnumerable<Expression> arguments;
50-
51-
return GetMethodCallSubject(methodCall, context, out arguments);
48+
// ReSharper disable once UnusedVariable
49+
return GetMethodCallSubject(methodCall, context, out var arguments);
5250
}
5351

5452
private static string GetMethodCallSubject(
@@ -153,12 +151,7 @@ private static string GetGenericArgumentsIfNecessary(IMethodInfo method, Transla
153151
.Where(name => name != null)
154152
.ToArray();
155153

156-
if (!argumentNames.Any())
157-
{
158-
return null;
159-
}
160-
161-
return $"<{string.Join(", ", argumentNames)}>";
154+
return argumentNames.Any() ? $"<{string.Join(", ", argumentNames)}>" : null;
162155
}
163156

164157
private static void RemoveSuppliedGenericTypeParameters(

0 commit comments

Comments
 (0)