From f7992208b2e5629dc4e289c137595f343ccd903c Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 2 May 2023 22:58:39 +1000 Subject: [PATCH 1/4] Add support for C#11 static interface members --- src/NHibernate/Proxy/ProxyBuilderHelper.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/NHibernate/Proxy/ProxyBuilderHelper.cs b/src/NHibernate/Proxy/ProxyBuilderHelper.cs index 64ee3879e67..7f922911616 100644 --- a/src/NHibernate/Proxy/ProxyBuilderHelper.cs +++ b/src/NHibernate/Proxy/ProxyBuilderHelper.cs @@ -21,6 +21,8 @@ namespace NHibernate.Proxy { internal static class ProxyBuilderHelper { + private const BindingFlags ProxiableMethodsBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + private static readonly ConstructorInfo ObjectConstructor = typeof(object).GetConstructor(System.Type.EmptyTypes); private static readonly ConstructorInfo SecurityCriticalAttributeConstructor = typeof(SecurityCriticalAttribute).GetConstructor(System.Type.EmptyTypes); private static readonly ConstructorInfo IgnoresAccessChecksToAttributeConstructor = typeof(IgnoresAccessChecksToAttribute).GetConstructor(new[] {typeof(string)}); @@ -94,10 +96,7 @@ internal static void CallDefaultBaseConstructor(ILGenerator il, System.Type pare internal static IEnumerable GetProxiableMethods(System.Type type) { - const BindingFlags candidateMethodsBindingFlags = - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - - return type.GetMethods(candidateMethodsBindingFlags).Where(m => m.IsProxiable()); + return type.GetMethods(ProxiableMethodsBindingFlags).Where(m => m.IsProxiable()); } internal static IEnumerable GetProxiableMethods(System.Type type, IEnumerable interfaces) @@ -105,12 +104,12 @@ internal static IEnumerable GetProxiableMethods(System.Type type, IE if (type.IsInterface || type == typeof(object) || type.GetInterfaces().Length == 0) { return GetProxiableMethods(type) - .Concat(interfaces.SelectMany(i => i.GetMethods())) + .Concat(interfaces.SelectMany(i => i.GetMethods(ProxiableMethodsBindingFlags))) .Distinct(); } var proxiableMethods = new HashSet(GetProxiableMethods(type), new MethodInfoComparer(type)); - foreach (var interfaceMethod in interfaces.SelectMany(i => i.GetMethods())) + foreach (var interfaceMethod in interfaces.SelectMany(i => i.GetMethods(ProxiableMethodsBindingFlags))) { proxiableMethods.Add(interfaceMethod); } From af370df1fc5818fc6d6219e7a72320c038867e36 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 2 May 2023 23:01:10 +1000 Subject: [PATCH 2/4] Add tests --- .../StaticProxyFactoryFixture.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs index 1f18e170e8a..d1b6b9c9faf 100644 --- a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs +++ b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs @@ -816,6 +816,39 @@ private static BinaryFormatter GetFormatter() #endif } +#if NET7_0_OR_GREATER + public interface IWithStaticAbstractMethod + { + static virtual void Method() + { + } + } + + public class ClassWithStaticInterfaceMethod : IWithStaticAbstractMethod + { + public static void Method() + { + } + } + + [Test(Description = "GH3295")] + public void VerifyProxyForClassWithStaticInterfaceMethod() + { + var factory = new StaticProxyFactory(); + factory.PostInstantiate( + typeof(ClassWithStaticInterfaceMethod).FullName, + typeof(ClassWithStaticInterfaceMethod), + new HashSet { typeof(INHibernateProxy) }, + null, null, null, true); + + var proxy = factory.GetProxy(1, null); + Assert.That(proxy, Is.Not.Null); + Assert.That(proxy, Is.InstanceOf()); + + Assert.That(factory.GetFieldInterceptionProxy(), Is.InstanceOf()); + } +#endif + #if NETFX private static void VerifyGeneratedAssembly(System.Action assemblyGenerator) { From 74e34537fca084d2f2f91188fb5ff98b34569645 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 2 May 2023 23:37:48 +1000 Subject: [PATCH 3/4] Extemd tests to C# 8 --- .../StaticProxyFactoryFixture.cs | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs index d1b6b9c9faf..31be3a9d2b6 100644 --- a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs +++ b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs @@ -816,17 +816,27 @@ private static BinaryFormatter GetFormatter() #endif } -#if NET7_0_OR_GREATER - public interface IWithStaticAbstractMethod +#if NETCOREAPP3_1_OR_GREATER + public interface IWithStaticMethods { - static virtual void Method() + // C# 8 + static void StaticMethod() + { + } + +#if NET7_0_OR_GREATER + // C# 11 + // C# 11 + static abstract void StaticAbstractMethod(); + static virtual void StaticVirtualMethod() { } +#endif } - public class ClassWithStaticInterfaceMethod : IWithStaticAbstractMethod + public class ClassWithStaticInterfaceMethods : IWithStaticMethods { - public static void Method() + public static void StaticAbstractMethod() { } } @@ -836,16 +846,16 @@ public void VerifyProxyForClassWithStaticInterfaceMethod() { var factory = new StaticProxyFactory(); factory.PostInstantiate( - typeof(ClassWithStaticInterfaceMethod).FullName, - typeof(ClassWithStaticInterfaceMethod), + typeof(ClassWithStaticInterfaceMethods).FullName, + typeof(ClassWithStaticInterfaceMethods), new HashSet { typeof(INHibernateProxy) }, null, null, null, true); var proxy = factory.GetProxy(1, null); Assert.That(proxy, Is.Not.Null); - Assert.That(proxy, Is.InstanceOf()); + Assert.That(proxy, Is.InstanceOf()); - Assert.That(factory.GetFieldInterceptionProxy(), Is.InstanceOf()); + Assert.That(factory.GetFieldInterceptionProxy(), Is.InstanceOf()); } #endif From 1a4523d45aaa7b09735efd3beeb336894e2afa69 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Tue, 2 May 2023 23:41:58 +1000 Subject: [PATCH 4/4] Fix code formatting --- .../StaticProxyTest/StaticProxyFactoryFixture.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs index 31be3a9d2b6..722bb604af2 100644 --- a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs +++ b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs @@ -825,9 +825,10 @@ static void StaticMethod() } #if NET7_0_OR_GREATER - // C# 11 // C# 11 static abstract void StaticAbstractMethod(); + + // C# 11 static virtual void StaticVirtualMethod() { }