Skip to content

Commit 80ba0ab

Browse files
author
Alexey Rumyantsev
committed
Problem with async methods in generic class fixed.
1 parent 6a1cf11 commit 80ba0ab

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

Fody/Cauldron.Interception.Cecilator/Extension.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,12 @@ internal static FieldReference CreateFieldReference(this Field field, Method met
904904
{
905905
var declaringType = new GenericInstanceType(field.DeclaringType.typeDefinition);
906906

907+
if (method.methodReference.DeclaringType.IsGenericInstance && method.methodReference.DeclaringType is GenericInstanceType genericInstanceType)
908+
{
909+
foreach (var parameter in genericInstanceType.GenericArguments)
910+
declaringType.GenericArguments.Add(parameter);
911+
}
912+
907913
foreach (var parameter in method.methodReference.GenericParameters)
908914
declaringType.GenericArguments.Add(parameter);
909915

@@ -1442,7 +1448,7 @@ internal static MethodReference MakeHostInstanceGeneric(this MethodReference sel
14421448
};
14431449

14441450
foreach (var parameter in self.Parameters)
1445-
reference.Parameters.Add(new ParameterDefinition(parameter.ParameterType));
1451+
reference.Parameters.Add(new ParameterDefinition(parameter.ParameterType) { Name = parameter.Name });
14461452

14471453
foreach (var generic_parameter in self.GenericParameters)
14481454
reference.GenericParameters.Add(new GenericParameter(generic_parameter.Name, reference));

UnitTests/Shared/MainTests/BasicInterceptors/Method_Interceptor_Code_Validation_Tests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,4 +767,32 @@ private object ValueType_Method_With_Single_Return_Object_()
767767
return 3434;
768768
}
769769
}
770+
771+
[TestClass]
772+
public class Method_Interceptor_Code_Validation_Generic_Tests<T>
773+
{
774+
[TestMethodInterceptor]
775+
public async Task Async_Method()
776+
{
777+
await Task.Run(() => default(T));
778+
}
779+
780+
[TestMethodInterceptor]
781+
public async Task<T> Generic_Async_Method()
782+
{
783+
return await Task.Run(() => default(T));
784+
}
785+
786+
[TestMethodInterceptor]
787+
public async Task<T> Generic_Async_Method_With_Parameters(int a, string b)
788+
{
789+
return await Task.Run(() => default(T));
790+
}
791+
792+
[TestMethodInterceptor]
793+
public async Task<T> Generic_Async_Method_With_Generic_Parameters<TParam1, TParam2>(TParam1 p1, int a, TParam2 p2, string b)
794+
{
795+
return await Task.Run(() => default(T));
796+
}
797+
}
770798
}

UnitTests/Shared/MainTests/BasicInterceptors/SimpleMethod_Interceptor_Code_Validation_Tests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,32 @@ public int WithSyncRoot()
9393
return 44;
9494
}
9595
}
96+
97+
[TestClass]
98+
public class SimpleMethod_Interceptor_Code_Validation_Generic_Tests<T>
99+
{
100+
[SimpleInterceptor]
101+
public async Task Async_Method()
102+
{
103+
await Task.Run(() => default(T));
104+
}
105+
106+
[SimpleInterceptor]
107+
public async Task<T> Generic_Async_Method()
108+
{
109+
return await Task.Run(() => default(T));
110+
}
111+
112+
[SimpleInterceptor]
113+
public async Task<T> Generic_Async_Method_With_Parameters(int a, string b)
114+
{
115+
return await Task.Run(() => default(T));
116+
}
117+
118+
[SimpleInterceptor]
119+
public async Task<T> Generic_Async_Method_With_Generic_Parameters<TParam1, TParam2>(TParam1 p1, int a, TParam2 p2, string b)
120+
{
121+
return await Task.Run(() => default(T));
122+
}
123+
}
96124
}

0 commit comments

Comments
 (0)