private static void Verify <T>(string script, T variant, Func <T, string> getName, Func <T, bool> isValid = null, Func <T, ISet <Ability> > getAbilities = null) { try { var serializedVariant = script == null ? variant : CSScriptLoaderHelpers.Load <T>(script); var name = getName(variant); if (name != getName(serializedVariant) || (isValid != null && !isValid(serializedVariant))) { throw new InvalidOperationException("Invalid"); } var abilities = getAbilities?.Invoke(serializedVariant); if (abilities != null) { foreach (var ability in abilities) { Validate(ability, name); } } } catch (Exception) { Console.WriteLine(script); throw; } }
private static void Serialize <T>(CSScriptLoaderBase <T> loader, Func <T, T> transform = null) where T : class, ILoadable { Console.WriteLine("Serializing " + typeof(T).Name + " instances..."); var directory = Path.Combine(AppContext.BaseDirectory, "New", loader.RelativePath); Directory.CreateDirectory(directory); foreach (var item in loader.GetAll()) { try { var itemToSerialize = transform != null?transform(item) : item; string script = null; if (SerializeToScript) { script = CSScriptSerializer.Serialize(itemToSerialize); File.WriteAllText( Path.Combine( loader.RelativePath, CSScriptLoaderHelpers.GetScriptFilename(itemToSerialize.Name)), script); } else { var code = CSClassSerializer.Serialize( itemToSerialize, itemToSerialize.Name, loader.DataType.Namespace, loader.DataType.Name); File.WriteAllText( Path.Combine(directory, CSScriptLoaderHelpers.GetClassFilename(itemToSerialize.Name)), code); } Verify(script, (dynamic)item); } catch (Exception e) { throw new Exception("Failed to serialize " + item.Name, e); } } }
public static string Serialize(object obj, string targetPropertyName, string targetNamespace, string targetClassName) { var expression = CompilationUnit() .WithUsings(List(CSScriptLoaderHelpers.Namespaces.Select(n => UsingDirective(ParseName(n))))) .WithMembers( SingletonList <MemberDeclarationSyntax>( NamespaceDeclaration(ParseName(targetNamespace)) .WithMembers( SingletonList <MemberDeclarationSyntax>(ClassDeclaration(targetClassName) .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword), Token(SyntaxKind.PartialKeyword))) .WithMembers(SingletonList <MemberDeclarationSyntax>( FieldDeclaration( VariableDeclaration(GetTypeSyntax(obj.GetType())) .WithVariables(SingletonSeparatedList( VariableDeclarator(Identifier( CSScriptLoaderHelpers.GenerateIdentifier( targetPropertyName))) .WithInitializer( EqualsValueClause(GetCreationExpression(obj)))))) .WithModifiers( TokenList(Token(SyntaxKind.PublicKeyword), Token(SyntaxKind.StaticKeyword), Token(SyntaxKind.ReadOnlyKeyword))))))))); using (var workspace = new AdhocWorkspace()) { return(Formatter.Format( expression, workspace, workspace.Options) .ToFullString()); } }