private void DoCall(Node Target) { switch (Type) { case TypeOfCall.RPC: MethodInfo methodInfo = MDStatics.GetMethodInfo(Target, Convert.ToInt32(Name)); if (methodInfo == null) { MDLog.Fatal(LOG_CAT, $"Could not find method {Target.GetType().ToString()}#{Name}"); return; } object[] convertedParams = MDStatics.ConvertParametersBackToObject(methodInfo, Parameters); MDStatics.GetReplicator().RpcSenderId = SenderPeerId; methodInfo.Invoke(Target, convertedParams); MDStatics.GetReplicator().RpcSenderId = -1; break; case TypeOfCall.RSET: MemberInfo memberInfo = MDStatics.GetMemberInfo(Target, Name); IMDDataConverter Converter = MDStatics.GetConverterForType(memberInfo.GetUnderlyingType()); object value = Converter.ConvertBackToObject(memberInfo.GetValue(Target), Parameters); MDLog.Trace(LOG_CAT, $"Setting {Name} on {Target.Name} to value {value}"); memberInfo.SetValue(Target, value); break; } }
/// <summary> /// Converts a set of parameters that were sent back to an object /// </summary> /// <param name="MethodInfo">The method info to convert for</param> /// <param name="Parameters">The parameters</param> /// <returns></returns> public static object[] ConvertParametersBackToObject(MethodInfo MethodInfo, params object[] Parameters) { if (Parameters == null || Parameters.Length == 0) { return(Parameters); } ParameterInfo[] CandidateParams = MethodInfo.GetParameters(); List <object> ConvertedParams = new List <object>(); for (int i = 0; i < Parameters.Length; i++) { // key0 = index, key1 = length object[] keys = Parameters[i].ToString().Split(SEPARATOR); int index = Convert.ToInt32(keys[0].ToString()); int length = Convert.ToInt32(keys[1].ToString()); // Extract parameters and use data converter object[] converterParams = Parameters.SubArray(i + 1, i + length); IMDDataConverter Converter = GetConverterForType(CandidateParams[index].ParameterType); object convertedValue = Converter.ConvertBackToObject(null, converterParams); // Add the value to our list ConvertedParams.Add(convertedValue); i += length; } return(ConvertedParams.ToArray()); }
/// <summary> /// Just for convenience /// </summary> /// <param name="CurrentObject">The current object we are updating</param> /// <param name="Parameters">The values we got across the network</param> /// <returns>The updated / new value</returns> protected object ConvertFromObject(object CurrentObject, object[] Parameters) { return(DataConverter.ConvertBackToObject(CurrentObject, (object[])Parameters)); }