Skip to content

Commit 9094df6

Browse files
author
Jacques Kang
committed
support generic method
1 parent 579c6a9 commit 9094df6

File tree

6 files changed

+59
-32
lines changed

6 files changed

+59
-32
lines changed

src/IpcServiceSample.ConsoleClient/Program.cs

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,42 +26,45 @@ private static async Task MainAsync(string[] args)
2626
.UseTcp(IPAddress.Loopback, 45684)
2727
.Build();
2828

29-
// test 1: call IPC service method with primitive types
30-
float result1 = await computingClient.InvokeAsync(x => x.AddFloat(1.23f, 4.56f));
31-
Console.WriteLine($"[TEST 1] sum of 2 floating number is: {result1}");
29+
//// test 1: call IPC service method with primitive types
30+
//float result1 = await computingClient.InvokeAsync(x => x.AddFloat(1.23f, 4.56f));
31+
//Console.WriteLine($"[TEST 1] sum of 2 floating number is: {result1}");
3232

33-
// test 2: call IPC service method with complex types
34-
ComplexNumber result2 = await computingClient.InvokeAsync(x => x.AddComplexNumber(
35-
new ComplexNumber(0.1f, 0.3f),
36-
new ComplexNumber(0.2f, 0.6f)));
37-
Console.WriteLine($"[TEST 2] sum of 2 complexe number is: {result2.A}+{result2.B}i");
33+
//// test 2: call IPC service method with complex types
34+
//ComplexNumber result2 = await computingClient.InvokeAsync(x => x.AddComplexNumber(
35+
// new ComplexNumber(0.1f, 0.3f),
36+
// new ComplexNumber(0.2f, 0.6f)));
37+
//Console.WriteLine($"[TEST 2] sum of 2 complexe number is: {result2.A}+{result2.B}i");
3838

39-
// test 3: call IPC service method with an array of complex types
40-
ComplexNumber result3 = await computingClient.InvokeAsync(x => x.AddComplexNumbers(new[]
41-
{
42-
new ComplexNumber(0.5f, 0.4f),
43-
new ComplexNumber(0.2f, 0.1f),
44-
new ComplexNumber(0.3f, 0.5f),
45-
}));
46-
Console.WriteLine($"[TEST 3] sum of 3 complexe number is: {result3.A}+{result3.B}i");
39+
//// test 3: call IPC service method with an array of complex types
40+
//ComplexNumber result3 = await computingClient.InvokeAsync(x => x.AddComplexNumbers(new[]
41+
//{
42+
// new ComplexNumber(0.5f, 0.4f),
43+
// new ComplexNumber(0.2f, 0.1f),
44+
// new ComplexNumber(0.3f, 0.5f),
45+
//}));
46+
//Console.WriteLine($"[TEST 3] sum of 3 complexe number is: {result3.A}+{result3.B}i");
4747

48-
// test 4: call IPC service method without parameter or return
49-
await systemClient.InvokeAsync(x => x.DoNothing());
50-
Console.WriteLine($"[TEST 4] invoked DoNothing()");
48+
//// test 4: call IPC service method without parameter or return
49+
//await systemClient.InvokeAsync(x => x.DoNothing());
50+
//Console.WriteLine($"[TEST 4] invoked DoNothing()");
5151

52-
// test 5: call IPC service method with enum parameter
53-
string text = await systemClient.InvokeAsync(x => x.ConvertText("hEllO woRd!", TextStyle.Upper));
54-
Console.WriteLine($"[TEST 5] {text}");
52+
//// test 5: call IPC service method with enum parameter
53+
//string text = await systemClient.InvokeAsync(x => x.ConvertText("hEllO woRd!", TextStyle.Upper));
54+
//Console.WriteLine($"[TEST 5] {text}");
5555

56-
// test 6: call IPC service method returning GUID
57-
Guid generatedId = await systemClient.InvokeAsync(x => x.GenerateId());
58-
Console.WriteLine($"[TEST 6] generated ID is: {generatedId}");
56+
//// test 6: call IPC service method returning GUID
57+
//Guid generatedId = await systemClient.InvokeAsync(x => x.GenerateId());
58+
//Console.WriteLine($"[TEST 6] generated ID is: {generatedId}");
5959

60-
// test 7: call IPC service method with byte array
61-
byte[] input = Encoding.UTF8.GetBytes("Test");
62-
byte[] reversed = await systemClient.InvokeAsync(x => x.ReverseBytes(input));
63-
Console.WriteLine($"[TEST 7] reversed bytes are: {Convert.ToBase64String(reversed)}");
60+
//// test 7: call IPC service method with byte array
61+
//byte[] input = Encoding.UTF8.GetBytes("Test");
62+
//byte[] reversed = await systemClient.InvokeAsync(x => x.ReverseBytes(input));
63+
//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

Lines changed: 5 additions & 0 deletions
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();
Lines changed: 1 addition & 2 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
namespace JKang.IpcServiceFramework
1+
using System;
2+
3+
namespace JKang.IpcServiceFramework
24
{
35
public class IpcRequest
46
{
57
public string MethodName { get; set; }
68
public object[] Parameters { get; set; }
9+
public Type[] GenericArguments { get; set; }
710
}
811
}

src/JKang.IpcServiceFramework.Server/IpcServiceEndpoint.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)