Skip to content

Commit fac7242

Browse files
committed
Make generic ByRefLikeArgument<> work
1 parent 82664d5 commit fac7242

3 files changed

Lines changed: 24 additions & 31 deletions

File tree

src/Castle.Core/DynamicProxy/ByRefLikeArgument.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
namespace Castle.DynamicProxy
2020
{
2121
using System;
22+
using System.Collections.Concurrent;
2223
using System.ComponentModel;
24+
using System.Reflection;
2325
using System.Runtime.CompilerServices;
2426

2527
/// <summary>
@@ -28,6 +30,27 @@ namespace Castle.DynamicProxy
2830
/// </summary>
2931
public unsafe class ByRefLikeArgument
3032
{
33+
#if FEATURE_ALLOWS_REF_STRUCT_ANTI_CONSTRAINT
34+
private static readonly ConcurrentDictionary<Type, ConstructorInfo> constructorMap = new();
35+
36+
internal static ConstructorInfo GetConstructorFor(Type byRefLikeType)
37+
{
38+
return constructorMap.GetOrAdd(byRefLikeType, static byRefLikeType =>
39+
{
40+
var type = typeof(ByRefLikeArgument<>).MakeGenericType(byRefLikeType);
41+
return type.GetConstructor([ typeof(void*) ])!;
42+
});
43+
}
44+
#else
45+
private static readonly ConstructorInfo constructor =
46+
typeof(ByRefLikeArgument).GetConstructor([ typeof(void*) ])!;
47+
48+
internal static ConstructorInfo GetConstructorFor(Type byRefLikeType)
49+
{
50+
return constructor;
51+
}
52+
#endif
53+
3154
protected void* ptr;
3255

3356
/// <summary>

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReferencesToObjectArrayExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void Emit(ILGenerator gen)
5353
// We cannot box a byref-like argument directly, so we wrap it as
5454
// `BoxedByRefLikeArgument` instead (which references it using a pointer).
5555
reference.EmitAddress(gen);
56-
gen.Emit(OpCodes.Newobj, ByRefLikeArgumentMethods.Constructor);
56+
gen.Emit(OpCodes.Newobj, ByRefLikeArgument.GetConstructorFor(reference.Type));
5757
gen.Emit(OpCodes.Stelem_Ref);
5858
continue;
5959
}

src/Castle.Core/DynamicProxy/Tokens/ByRefLikeArgumentMethods.cs

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)