Skip to content

Commit

Permalink
support generic method
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacques Kang committed Nov 19, 2018

Unverified

This user has not yet uploaded their public signing key.
1 parent 579c6a9 commit 9094df6
Showing 6 changed files with 59 additions and 32 deletions.
61 changes: 32 additions & 29 deletions src/IpcServiceSample.ConsoleClient/Program.cs
Original file line number Diff line number Diff line change
@@ -26,42 +26,45 @@ private static async Task MainAsync(string[] args)
.UseTcp(IPAddress.Loopback, 45684)
.Build();

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

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

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

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

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

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

// test 7: call IPC service method with byte array
byte[] input = Encoding.UTF8.GetBytes("Test");
byte[] reversed = await systemClient.InvokeAsync(x => x.ReverseBytes(input));
Console.WriteLine($"[TEST 7] reversed bytes are: {Convert.ToBase64String(reversed)}");
//// test 7: call IPC service method with byte array
//byte[] input = Encoding.UTF8.GetBytes("Test");
//byte[] reversed = await systemClient.InvokeAsync(x => x.ReverseBytes(input));
//Console.WriteLine($"[TEST 7] reversed bytes are: {Convert.ToBase64String(reversed)}");

// test 8: call IPC service method with generic parameter
string print = await systemClient.InvokeAsync(x => x.Printout(DateTime.UtcNow));
Console.WriteLine($"[TEST 8] print out value: {print}");
}
catch (Exception ex)
{
5 changes: 5 additions & 0 deletions src/IpcServiceSample.ConsoleServer/SystemService.cs
Original file line number Diff line number Diff line change
@@ -28,6 +28,11 @@ public Guid GenerateId()
return Guid.NewGuid();
}

public string Printout<T>(T value)
{
return value.ToString();
}

public byte[] ReverseBytes(byte[] input)
{
return input.Reverse().ToArray();
3 changes: 1 addition & 2 deletions src/IpcServiceSample.ServiceContracts/ISystemService.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace IpcServiceSample.ServiceContracts
{
@@ -10,5 +8,6 @@ public interface ISystemService
string ConvertText(string text, TextStyle style);
Guid GenerateId();
byte[] ReverseBytes(byte[] input);
string Printout<T>(T value);
}
}
1 change: 1 addition & 0 deletions src/JKang.IpcServiceFramework.Client/IpcServiceClient.cs
Original file line number Diff line number Diff line change
@@ -83,6 +83,7 @@ private static IpcRequest GetRequest(Expression exp, MyInterceptor interceptor)
{
MethodName = interceptor.LastInvocation.Method.Name,
Parameters = interceptor.LastInvocation.Arguments,
GenericArguments = interceptor.LastInvocation.GenericArguments,
};
}

5 changes: 4 additions & 1 deletion src/JKang.IpcServiceFramework.Core/IpcRequest.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
namespace JKang.IpcServiceFramework
using System;

namespace JKang.IpcServiceFramework
{
public class IpcRequest
{
public string MethodName { get; set; }
public object[] Parameters { get; set; }
public Type[] GenericArguments { get; set; }
}
}
16 changes: 16 additions & 0 deletions src/JKang.IpcServiceFramework.Server/IpcServiceEndpoint.cs
Original file line number Diff line number Diff line change
@@ -95,11 +95,22 @@ protected IpcResponse GetReponse(IpcRequest request, IServiceScope scope)
return IpcResponse.Fail($"Parameter mismatch.");
}

Type[] genericArguments = method.GetGenericArguments();
if (genericArguments.Length != request.GenericArguments.Length)
{
return IpcResponse.Fail($"Generic arguments mismatch.");
}

object[] args = new object[paramInfos.Length];
for (int i = 0; i < args.Length; i++)
{
object origValue = request.Parameters[i];
Type destType = paramInfos[i].ParameterType;
if (destType.IsGenericParameter)
{
destType = request.GenericArguments[destType.GenericParameterPosition];
}

if (_converter.TryConvert(origValue, destType, out object arg))
{
args[i] = arg;
@@ -112,6 +123,11 @@ protected IpcResponse GetReponse(IpcRequest request, IServiceScope scope)

try
{
if (method.IsGenericMethod)
{
method = method.MakeGenericMethod(request.GenericArguments);
}

object @return = method.Invoke(service, args);
if (@return is Task)
{

0 comments on commit 9094df6

Please sign in to comment.