Skip to content

Commit fc04dfb

Browse files
Fix multiple interface constraints for methods.
1 parent ee77c78 commit fc04dfb

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

LazyProxy.Tests/LazyProxyBuilderTests.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ public class LazyProxyBuilderTests
99
{
1010
public interface IBaseArgument { }
1111

12+
public interface IOtherBaseArgument { }
13+
1214
public abstract class BaseArgument : IBaseArgument { }
1315

1416
public abstract class BaseArgument2 { }
1517

16-
public struct TestArgument : IBaseArgument { }
18+
public struct TestArgument : IBaseArgument, IOtherBaseArgument { }
1719

1820
// ReSharper disable once MemberCanBePrivate.Global
1921
public class TestArgument2 : BaseArgument { }
@@ -44,6 +46,10 @@ public interface ITestService : IParentTestService
4446
string MethodWithDefaultValue(string arg = "arg");
4547
string MethodWithOutValue(out string arg);
4648
string MethodWithRefValue(ref TestArgument arg);
49+
50+
void GenericMethod<T>()
51+
where T : IBaseArgument, IOtherBaseArgument { }
52+
4753
string GenericMethod<T1, T2, T3>(string arg)
4854
where T1 : class, IBaseArgument, new()
4955
where T2 : struct
@@ -76,7 +82,7 @@ public void ProxyMustImplementInterface()
7682
public void ExceptionMustBeThrownForBuildingProxyByClass()
7783
{
7884
Assert.Throws<NotSupportedException>(
79-
() => LazyProxyBuilder.GetType<AbstractTestService>());
85+
LazyProxyBuilder.GetType<AbstractTestService>);
8086
}
8187

8288
[Fact]
@@ -407,5 +413,12 @@ public void GenericInterfaceWithDifferentTypeParametersMustBeCreatedWithoutExcep
407413

408414
Assert.Null(exception);
409415
}
416+
417+
[Fact]
418+
public void GenericMethodWithMultipleInterfaceConstraintsMustBeProxied()
419+
{
420+
var proxy = LazyProxyBuilder.CreateInstance(Mock.Of<ITestService>);
421+
proxy.GenericMethod<TestArgument>();
422+
}
410423
}
411424
}

LazyProxy/LazyProxyBuilder.cs

+12-1
Original file line numberDiff line numberDiff line change
@@ -312,18 +312,29 @@ private static void AddGenericParameters(
312312
definedGenericParameter.SetGenericParameterAttributes(genericParameterAttributes);
313313

314314
var genericParameterConstraints = genericParameter.GetGenericParameterConstraints();
315+
if (!genericParameterConstraints.Any())
316+
{
317+
return;
318+
}
319+
320+
var interfaceConstraints = new List<Type>(genericParameterConstraints.Length);
315321

316322
foreach (var constraint in genericParameterConstraints)
317323
{
318324
if (constraint.IsInterface)
319325
{
320-
definedGenericParameter.SetInterfaceConstraints(constraint);
326+
interfaceConstraints.Add(constraint);
321327
}
322328
else
323329
{
324330
definedGenericParameter.SetBaseTypeConstraint(constraint);
325331
}
326332
}
333+
334+
if (interfaceConstraints.Any())
335+
{
336+
definedGenericParameter.SetInterfaceConstraints(interfaceConstraints.ToArray());
337+
}
327338
}
328339
}
329340
}

0 commit comments

Comments
 (0)