diff --git a/CHANGELOG.md b/CHANGELOG.md index c64259b44..1408b2c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,11 @@ * Enhance BoDi error handling to provide the name of the interface being registered when that interface has already been resolved (#324) * Improve code-behind feature file compilation speed (#336) +* Improve parameter type naming for generic types (#343) ## Bug fixes: -*Contributors of this release (in alphabetical order):* @clrudolphi, @obligaron +*Contributors of this release (in alphabetical order):* @clrudolphi, @obligaron, @olegKoshmeliuk # v2.2.1 - 2024-11-08 diff --git a/Reqnroll/Bindings/Reflection/BindingReflectionExtensions.cs b/Reqnroll/Bindings/Reflection/BindingReflectionExtensions.cs index f1a62e0fa..43e51b1e8 100644 --- a/Reqnroll/Bindings/Reflection/BindingReflectionExtensions.cs +++ b/Reqnroll/Bindings/Reflection/BindingReflectionExtensions.cs @@ -17,7 +17,7 @@ public static bool IsAssignableTo(this Type type, IBindingType baseType) if (baseType is RuntimeBindingType runtimeBindingType) return runtimeBindingType.Type.IsAssignableFrom(type); - if (type.FullName == baseType.FullName) + if (new RuntimeBindingType(type).FullName == baseType.FullName) return true; if (type.BaseType != null && IsAssignableTo(type.BaseType, baseType)) @@ -28,10 +28,11 @@ public static bool IsAssignableTo(this Type type, IBindingType baseType) public static bool IsAssignableFrom(this Type baseType, IBindingType type) { + var bindingType = new RuntimeBindingType(baseType); if (type is IPolymorphicBindingType polymorphicBindingType) - return polymorphicBindingType.IsAssignableTo(new RuntimeBindingType(baseType)); + return polymorphicBindingType.IsAssignableTo(bindingType); - if (type.FullName == baseType.FullName) + if (type.FullName == bindingType.FullName) return true; return false; diff --git a/Reqnroll/Bindings/Reflection/RuntimeBindingType.cs b/Reqnroll/Bindings/Reflection/RuntimeBindingType.cs index 7d99c8467..50a67d105 100644 --- a/Reqnroll/Bindings/Reflection/RuntimeBindingType.cs +++ b/Reqnroll/Bindings/Reflection/RuntimeBindingType.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Reqnroll.Bindings.Reflection { @@ -8,13 +9,30 @@ public class RuntimeBindingType : IPolymorphicBindingType public string Name => Type.Name; - public string FullName => Type.FullName; + public string FullName { get; } public string AssemblyName => Type.Assembly.GetName().Name; public RuntimeBindingType(Type type) { Type = type; + FullName = GetFullName(type); + } + + private static string GetFullName(Type type) + { + if (!type.IsConstructedGenericType) + { + return type.FullName; + } + + if (type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + return type.GenericTypeArguments[0].FullName + "?"; + } + + var genericParams = string.Join(",", type.GenericTypeArguments.Select(x => x.Name)); + return $"{type.Namespace}.{type.Name.Split('`')[0]}<{genericParams}>"; } public bool IsAssignableTo(IBindingType baseType) @@ -37,7 +55,7 @@ public override bool Equals(object obj) if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != GetType()) return false; - return Equals((RuntimeBindingType) obj); + return Equals((RuntimeBindingType)obj); } public override int GetHashCode()