Skip to content

Commit 19e7b40

Browse files
authored
Merge pull request #1752 from lbargaoanu/VBProjectToParameters
Consider VB closures
2 parents 4840545 + 71df9e0 commit 19e7b40

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

src/AutoMapper/QueryableExtensions/ExpressionBuilder.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace AutoMapper.QueryableExtensions
1111
{
12+
using System.Runtime.CompilerServices;
1213
using Configuration;
1314
using Execution;
1415

@@ -264,15 +265,21 @@ public ConstantExpressionReplacementVisitor(
264265

265266
protected override Expression VisitMember(MemberExpression node)
266267
{
267-
if (!node.Member.DeclaringType.Name.Contains("<>"))
268-
return base.VisitMember(node);
269-
270-
if (!_paramValues.ContainsKey(node.Member.Name))
268+
if(!node.Member.DeclaringType.Has<CompilerGeneratedAttribute>())
269+
{
271270
return base.VisitMember(node);
272-
273-
return Expression.Convert(
274-
Expression.Constant(_paramValues[node.Member.Name]),
275-
node.Member.GetMemberType());
271+
}
272+
object parameterValue;
273+
var parameterName = node.Member.Name;
274+
if(!_paramValues.TryGetValue(parameterName, out parameterValue))
275+
{
276+
const string VBPrefix = "$VB$Local_";
277+
if(!parameterName.StartsWith(VBPrefix, StringComparison.Ordinal) || !_paramValues.TryGetValue(parameterName.Substring(VBPrefix.Length), out parameterValue))
278+
{
279+
return base.VisitMember(node);
280+
}
281+
}
282+
return Convert(Constant(parameterValue), node.Member.GetMemberType());
276283
}
277284
}
278285

src/AutoMapper/TypeExtensions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ namespace AutoMapper
1010
#endif
1111

1212
internal static class TypeExtensions
13-
{
13+
{
14+
public static bool Has<TAttribute>(this Type type) where TAttribute : Attribute
15+
{
16+
return type.GetTypeInfo().IsDefined(typeof(TAttribute), inherit: false);
17+
}
18+
1419
public static Type GetGenericTypeDefinitionIfGeneric(this Type type)
1520
{
1621
return type.IsGenericType() ? type.GetGenericTypeDefinition() : type;

0 commit comments

Comments
 (0)