Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        /// <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());
        }
Ejemplo n.º 3
0
 /// <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));
 }