Skip to content

Commit 983ea82

Browse files
committed
Copy generic type parameter constraints more precisely
1 parent 0526621 commit 983ea82

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

src/Castle.Core/DynamicProxy/Generators/Emitters/GenericUtil.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2004-2021 Castle Project - http://www.castleproject.org/
1+
// Copyright 2004-2025 Castle Project - http://www.castleproject.org/
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -121,9 +121,25 @@ private static GenericTypeParameterBuilder[] CopyGenericArguments(
121121
{
122122
var attributes = originalGenericArguments[i].GenericParameterAttributes;
123123
newGenericParameters[i].SetGenericParameterAttributes(attributes);
124-
var constraints = AdjustGenericConstraints(methodToCopyGenericsFrom, newGenericParameters, originalGenericArguments, originalGenericArguments[i].GetGenericParameterConstraints());
125124

126-
newGenericParameters[i].SetInterfaceConstraints(constraints);
125+
var constraints = originalGenericArguments[i].GetGenericParameterConstraints();
126+
if (constraints.Length > 0)
127+
{
128+
constraints = AdjustGenericConstraints(methodToCopyGenericsFrom, newGenericParameters, originalGenericArguments, constraints);
129+
130+
var baseTypeConstraint = Array.Find(constraints, static c => c.IsClass);
131+
if (baseTypeConstraint != null)
132+
{
133+
newGenericParameters[i].SetBaseTypeConstraint(baseTypeConstraint);
134+
}
135+
136+
var interfaceConstraints = Array.FindAll(constraints, static c => c.IsInterface);
137+
if (interfaceConstraints.Length > 0)
138+
{
139+
newGenericParameters[i].SetInterfaceConstraints(interfaceConstraints);
140+
}
141+
}
142+
127143
CopyNonInheritableAttributes(newGenericParameters[i], originalGenericArguments[i]);
128144
}
129145
catch (NotSupportedException)

0 commit comments

Comments
 (0)