diff --git a/src/Controls/src/Build.Tasks/TypeReferenceExtensions.cs b/src/Controls/src/Build.Tasks/TypeReferenceExtensions.cs index 7a6631746f97..1989c825b1a6 100644 --- a/src/Controls/src/Build.Tasks/TypeReferenceExtensions.cs +++ b/src/Controls/src/Build.Tasks/TypeReferenceExtensions.cs @@ -414,8 +414,9 @@ public static GenericInstanceType ResolveGenericParameters(this GenericInstanceT List args = new List(); for (var i = 0; i < self.GenericArguments.Count; i++) { - var genericParameter = self.GenericArguments[i] as GenericParameter; - if (genericParameter == null) + if (self.GenericArguments[i] is ArrayType arrayType && arrayType.ElementType is GenericParameter arrayGenericParameter) + args.Add(declaringTypeReference.GenericArguments[arrayGenericParameter.Position].MakeArrayType()); + else if (self.GenericArguments[i] is not GenericParameter genericParameter) args.Add(self.GenericArguments[i].ResolveGenericParameters(declaringTypeReference)); else if (genericParameter.Type == GenericParameterType.Type) args.Add(declaringTypeReference.GenericArguments[genericParameter.Position]); diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml b/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml new file mode 100644 index 000000000000..0167e5bc45c9 --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml.cs b/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml.cs new file mode 100644 index 000000000000..255c9cd202b8 --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/Maui10583.xaml.cs @@ -0,0 +1,75 @@ +using System; +using Microsoft.Maui.ApplicationModel; +using Microsoft.Maui.Controls.Core.UnitTests; +using Microsoft.Maui.Devices; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.UnitTests; +using Microsoft.Maui.Dispatching; +using NUnit.Framework; +using System.Collections.Generic; + +namespace Microsoft.Maui.Controls.Xaml.UnitTests +{ + [AcceptEmptyServiceProvider] + public class Maui10583EnumValuesExtension : IMarkupExtension where T : struct, Enum + { + public T[] ProvideValue(IServiceProvider serviceProvider) + { + return Enum.GetValues(); + } + + object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) + { + return ProvideValue(serviceProvider); + } + } + + public enum Maui10583Enum { + John, Paul, George, Ringo + } + + public partial class Maui10583 : ContentPage + { + public Maui10583() => InitializeComponent(); + public Maui10583(bool useCompiledXaml) + { + //this stub will be replaced at compile time + } + + [TestFixture] + class Tests + { + [SetUp] + public void Setup() + { + AppInfo.SetCurrent(new MockAppInfo()); + DispatcherProvider.SetCurrent(new DispatcherProviderStub()); + + } + + [TearDown] + public void TearDown() + { + DispatcherProvider.SetCurrent(null); + AppInfo.SetCurrent(null); + } + + [Test] + public void GenericMarkupExtensions([Values(false, true)] bool useCompiledXaml) + { + if (true) + { + MockCompiler.Compile(typeof(Maui10583), out var methodDefinition); + + } + var page = new Maui10583(useCompiledXaml); + + Assert.That(page.lv.ItemsSource, Is.Not.Null); + var items = page.lv.ItemsSource as Maui10583Enum[]; + Assert.That(items[1], Is.EqualTo(Maui10583Enum.Paul)); + + + } + } + } +} diff --git a/src/Controls/tests/Xaml.UnitTests/MockCompiler.cs b/src/Controls/tests/Xaml.UnitTests/MockCompiler.cs index 4a7310d2e004..fa7222ee6193 100644 --- a/src/Controls/tests/Xaml.UnitTests/MockCompiler.cs +++ b/src/Controls/tests/Xaml.UnitTests/MockCompiler.cs @@ -11,7 +11,6 @@ public static class MockCompiler { public static void Compile(Type type, string targetFramework = null) { - MethodDefinition _; Compile(type, out _, targetFramework); } diff --git a/src/Controls/tests/Xaml.UnitTests/XamlC/TypeReferenceExtensionsTests.cs b/src/Controls/tests/Xaml.UnitTests/XamlC/TypeReferenceExtensionsTests.cs index a6ed1e9f0d1b..54a425840d38 100644 --- a/src/Controls/tests/Xaml.UnitTests/XamlC/TypeReferenceExtensionsTests.cs +++ b/src/Controls/tests/Xaml.UnitTests/XamlC/TypeReferenceExtensionsTests.cs @@ -71,6 +71,10 @@ class Grault : IGrault { } + + class Zoo : IGrault + { } + interface ICovariant { } @@ -242,12 +246,28 @@ public void TestImplementsGenericInterface() IList arguments; var garply = module.ImportReference(typeof(Garply)); - Assert.That(garply.ImplementsGenericInterface(new XamlCache(), "Microsoft.Maui.Controls.XamlcUnitTests.TypeReferenceExtensionsTests/IGrault`1", out igrault, out arguments)); + Assert.That(garply.ImplementsGenericInterface(new XamlCache(), "Microsoft.Maui.Controls.XamlcUnitTests.TypeReferenceExtensionsTests/IGrault`1", out igrault, out arguments)); Assert.AreEqual("System", igrault.GenericArguments[0].Namespace); Assert.AreEqual("Byte", igrault.GenericArguments[0].Name); Assert.AreEqual("System", arguments[0].Namespace); Assert.AreEqual("Byte", arguments[0].Name); } + + [Test] + //https://github.com/dotnet/maui/issues/10583 + public void TestImplementsGenericInterfaceWithArray() + { + GenericInstanceType igrault; + IList arguments; + var garply = module.ImportReference(typeof(Zoo)); + + Assert.That(garply.ImplementsGenericInterface(new XamlCache(), "Microsoft.Maui.Controls.XamlcUnitTests.TypeReferenceExtensionsTests/IGrault`1", out igrault, out arguments)); + + Assert.AreEqual("System", igrault.GenericArguments[0].Namespace); + Assert.AreEqual("Byte[]", igrault.GenericArguments[0].Name); + Assert.AreEqual("System", arguments[0].Namespace); + Assert.AreEqual("Byte[]", arguments[0].Name); + } } }