From afc3f01a100fc5981a69eef22ff21855add9c572 Mon Sep 17 00:00:00 2001 From: Will Gunaratne Date: Wed, 26 Feb 2025 11:13:29 +0000 Subject: [PATCH] Fix generic base codec generic type parameter resolution --- .../Serializers/CodecProvider.cs | 2 +- .../GenericBaseClassTest.cs | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/Orleans.Serialization.UnitTests/GenericBaseClassTest.cs diff --git a/src/Orleans.Serialization/Serializers/CodecProvider.cs b/src/Orleans.Serialization/Serializers/CodecProvider.cs index 18b8b5363d2..0aa26a41c83 100644 --- a/src/Orleans.Serialization/Serializers/CodecProvider.cs +++ b/src/Orleans.Serialization/Serializers/CodecProvider.cs @@ -543,7 +543,7 @@ private IFieldCodec CreateCodecInstance(Type fieldType, Type searchType) } else if (searchType.BaseType is object && CreateCodecInstance( - fieldType, + fieldType.BaseType, searchType.BaseType switch { { IsConstructedGenericType: true } => searchType.BaseType.GetGenericTypeDefinition(), diff --git a/test/Orleans.Serialization.UnitTests/GenericBaseClassTest.cs b/test/Orleans.Serialization.UnitTests/GenericBaseClassTest.cs new file mode 100644 index 00000000000..bb5bff30261 --- /dev/null +++ b/test/Orleans.Serialization.UnitTests/GenericBaseClassTest.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Orleans.Serialization.UnitTests +{ + [GenerateSerializer] + abstract class Base; + + class Derived : Base; + + [Trait("Category", "BVT")] + public class GenericBaseClassTest + { + private readonly ServiceProvider _services; + private readonly Serializer _serializer; + public GenericBaseClassTest() + { + _services = new ServiceCollection() + .AddSerializer() + .BuildServiceProvider(); + _serializer = _services.GetRequiredService(); + } + + [Fact] + public void DerivedNoGeneric() + { + Assert.False(_serializer.CanSerialize(typeof(Derived))); + } + } +}