Skip to content

Commit 99e246c

Browse files
authored
Merge pull request #45 from jacqueskang/generic-support
Support generic method
2 parents 890b910 + f85b56b commit 99e246c

File tree

6 files changed

+37
-4
lines changed

6 files changed

+37
-4
lines changed

src/IpcServiceSample.ConsoleClient/Program.cs

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ private static async Task MainAsync(string[] args)
6262
byte[] reversed = await systemClient.InvokeAsync(x => x.ReverseBytes(input));
6363
Console.WriteLine($"[TEST 7] reversed bytes are: {Convert.ToBase64String(reversed)}");
6464

65+
// test 8: call IPC service method with generic parameter
66+
string print = await systemClient.InvokeAsync(x => x.Printout(DateTime.UtcNow));
67+
Console.WriteLine($"[TEST 8] print out value: {print}");
6568
}
6669
catch (Exception ex)
6770
{

src/IpcServiceSample.ConsoleServer/SystemService.cs

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ public Guid GenerateId()
2828
return Guid.NewGuid();
2929
}
3030

31+
public string Printout<T>(T value)
32+
{
33+
return value.ToString();
34+
}
35+
3136
public byte[] ReverseBytes(byte[] input)
3237
{
3338
return input.Reverse().ToArray();
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
42

53
namespace IpcServiceSample.ServiceContracts
64
{
@@ -10,5 +8,6 @@ public interface ISystemService
108
string ConvertText(string text, TextStyle style);
119
Guid GenerateId();
1210
byte[] ReverseBytes(byte[] input);
11+
string Printout<T>(T value);
1312
}
1413
}

src/JKang.IpcServiceFramework.Client/IpcServiceClient.cs

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ private static IpcRequest GetRequest(Expression exp, MyInterceptor interceptor)
8383
{
8484
MethodName = interceptor.LastInvocation.Method.Name,
8585
Parameters = interceptor.LastInvocation.Arguments,
86+
GenericArguments = interceptor.LastInvocation.GenericArguments,
8687
};
8788
}
8889

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
namespace JKang.IpcServiceFramework
1+
using System;
2+
3+
namespace JKang.IpcServiceFramework
24
{
35
public class IpcRequest
46
{
7+
private Type[] _genericArguments = new Type[0];
8+
59
public string MethodName { get; set; }
610
public object[] Parameters { get; set; }
11+
public Type[] GenericArguments
12+
{
13+
get => _genericArguments ?? new Type[0];
14+
set => _genericArguments = value;
15+
}
716
}
817
}

src/JKang.IpcServiceFramework.Server/IpcServiceEndpoint.cs

+17-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected async Task ProcessAsync(Stream server, ILogger logger, CancellationTok
5454

5555
cancellationToken.ThrowIfCancellationRequested();
5656

57-
logger?.LogDebug($"[thread {Thread.CurrentThread.ManagedThreadId}] request received, invoking corresponding method...");
57+
logger?.LogDebug($"[thread {Thread.CurrentThread.ManagedThreadId}] request received, invoking '{request.MethodName}'...");
5858
IpcResponse response;
5959
using (IServiceScope scope = ServiceProvider.CreateScope())
6060
{
@@ -95,11 +95,22 @@ protected IpcResponse GetReponse(IpcRequest request, IServiceScope scope)
9595
return IpcResponse.Fail($"Parameter mismatch.");
9696
}
9797

98+
Type[] genericArguments = method.GetGenericArguments();
99+
if (genericArguments.Length != request.GenericArguments.Length)
100+
{
101+
return IpcResponse.Fail($"Generic arguments mismatch.");
102+
}
103+
98104
object[] args = new object[paramInfos.Length];
99105
for (int i = 0; i < args.Length; i++)
100106
{
101107
object origValue = request.Parameters[i];
102108
Type destType = paramInfos[i].ParameterType;
109+
if (destType.IsGenericParameter)
110+
{
111+
destType = request.GenericArguments[destType.GenericParameterPosition];
112+
}
113+
103114
if (_converter.TryConvert(origValue, destType, out object arg))
104115
{
105116
args[i] = arg;
@@ -112,6 +123,11 @@ protected IpcResponse GetReponse(IpcRequest request, IServiceScope scope)
112123

113124
try
114125
{
126+
if (method.IsGenericMethod)
127+
{
128+
method = method.MakeGenericMethod(request.GenericArguments);
129+
}
130+
115131
object @return = method.Invoke(service, args);
116132
if (@return is Task)
117133
{

0 commit comments

Comments
 (0)