From 5cf0d400d5911eda935ef503bbe104d8c63377ea Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 14 Oct 2023 10:03:34 +0200 Subject: [PATCH] DynamicLinqTypeAttribute can now also be defined on an interface --- .../DynamicLinqTypeAttribute.cs | 17 +++++----- .../DynamicExpressionParserTests.cs | 31 +++++++++++++++++-- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/System.Linq.Dynamic.Core/CustomTypeProviders/DynamicLinqTypeAttribute.cs b/src/System.Linq.Dynamic.Core/CustomTypeProviders/DynamicLinqTypeAttribute.cs index 5db6901c9..13fc23d2e 100644 --- a/src/System.Linq.Dynamic.Core/CustomTypeProviders/DynamicLinqTypeAttribute.cs +++ b/src/System.Linq.Dynamic.Core/CustomTypeProviders/DynamicLinqTypeAttribute.cs @@ -1,10 +1,9 @@ -namespace System.Linq.Dynamic.Core.CustomTypeProviders +namespace System.Linq.Dynamic.Core.CustomTypeProviders; + +/// +/// Indicates to Dynamic Linq to consider the Type as a valid dynamic linq type. +/// +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum, AllowMultiple = false, Inherited = false)] +public sealed class DynamicLinqTypeAttribute : Attribute { - /// - /// Indicates to Dynamic Linq to consider the Type as a valid dynamic linq type. - /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, AllowMultiple = false, Inherited = false)] - public sealed class DynamicLinqTypeAttribute : Attribute - { - } -} +} \ No newline at end of file diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs index acf8748e2..a6a817726 100644 --- a/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs @@ -88,6 +88,17 @@ public class CustomClassWithMethodWithDynamicLinqTypeAttribute public int GetAge(int x) => x; } + [DynamicLinqType] + public interface ICustomInterfaceWithMethodWithDynamicLinqTypeAttribute + { + int GetAge(int x); + } + + public class CustomClassImplementingInterface : ICustomInterfaceWithMethodWithDynamicLinqTypeAttribute + { + public int GetAge(int x) => x; + } + [DynamicLinqType] public class CustomClassWithStaticMethodWithDynamicLinqTypeAttribute { @@ -1057,7 +1068,7 @@ public void DynamicExpressionParser_ParseLambda_CustomStaticMethod_WhenClassHasD // Act var lambdaExpression = DynamicExpressionParser.ParseLambda(typeof(CustomClassWithStaticMethodWithDynamicLinqTypeAttribute), null, expression); var del = lambdaExpression.Compile(); - var result = (int)del.DynamicInvoke(context); + var result = (int?)del.DynamicInvoke(context); // Assert Check.That(result).IsEqualTo(10); @@ -1073,12 +1084,28 @@ public void DynamicExpressionParser_ParseLambda_CustomMethod_WhenClassHasDynamic // Act var lambdaExpression = DynamicExpressionParser.ParseLambda(typeof(CustomClassWithMethodWithDynamicLinqTypeAttribute), null, expression); var del = lambdaExpression.Compile(); - var result = (int)del.DynamicInvoke(context); + var result = (int?)del.DynamicInvoke(context); // Assert Check.That(result).IsEqualTo(10); } + [Fact] + public void DynamicExpressionParser_ParseLambda_CustomInterface_WhenInterfaceHasDynamicLinqTypeAttribute_ShouldWorkCorrect() + { + // Arrange + var context = new CustomClassImplementingInterface(); + var expression = $"{nameof(ICustomInterfaceWithMethodWithDynamicLinqTypeAttribute.GetAge)}(10)"; + + // Act + var lambdaExpression = DynamicExpressionParser.ParseLambda(typeof(ICustomInterfaceWithMethodWithDynamicLinqTypeAttribute), null, expression); + var del = lambdaExpression.Compile(); + var result = (int?)del.DynamicInvoke(context); + + // Assert + result.Should().Be(10); + } + [Fact] public void DynamicExpressionParser_ParseLambda_CustomMethod_WhenClassDoesNotHaveDynamicLinqTypeAttribute_ShouldThrowException() {