private static double GetNumberMember(SProtoObject obj, string member) { var memberObj = SObject.Unbox(obj.Members[member]); if (memberObj is SNumber) return ((SNumber)memberObj).Value; else return -1; }
private static string GetStringMember(SProtoObject obj, string member) { var memberObj = SObject.Unbox(obj.Members[member]); if (memberObj is SString) return ((SString)memberObj).Value; else return ""; }
private static object TranslateDynamic(SProtoObject obj) { var returnObj = new ExpandoObject() as IDictionary<string, object>; foreach (var item in obj.Members) { var memberName = item.Key; // Do not translate back the prototype and super instances: if (memberName != SProtoObject.MEMBER_NAME_PROTOTYPE && memberName != SProtoObject.MEMBER_NAME_SUPER) { var memberContent = SObject.Unbox(item.Value); returnObj.Add(memberName, Translate(memberContent)); } } return returnObj; }
/// <summary> /// Translates an <see cref="SObject"/> to a specific type. /// </summary> public static object Translate(SProtoObject obj, Type t) { var instance = Activator.CreateInstance(t); var fields = t .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null) .ToArray(); foreach (var field in fields) { var varAttr = field.GetCustomAttribute<ScriptVariableAttribute>(false); if (varAttr != null) { var identifier = field.Name; if (!string.IsNullOrEmpty(varAttr.VariableName)) identifier = varAttr.VariableName; var setValue = SObject.Unbox(obj.Members[identifier]); try { field.SetValue(instance, Translate(setValue)); } catch (Exception) { // This is most likely a type binding issue: Set null if the types don't fit! field.SetValue(instance, null); } } else { var refAttr = field.GetCustomAttribute<ReferenceAttribute>(false); if (refAttr != null) { var identifier = field.Name; if (!string.IsNullOrEmpty(refAttr.VariableName)) identifier = refAttr.VariableName; field.SetValue(instance, obj.ReferenceContainer[identifier]); } } } return instance; }
private static SObject TranslateExpandoObject(ScriptProcessor processor, ExpandoObject objIn) { var obj = new SProtoObject(); foreach (var member in objIn) obj.AddMember(member.Key, Translate(processor, member.Value)); return obj; }