public static void GetDictionaryTypes(ReferencedFileSave referencedFileSave, out string keyType, out string valueType) { valueType = referencedFileSave.GetTypeForCsvFile(); // To know the value type, we gotta pop this bad boy open and find the first requied type keyType = null; char oldDelimiter = CsvFileManager.Delimiter; switch (referencedFileSave.CsvDelimiter) { case AvailableDelimiters.Comma: CsvFileManager.Delimiter = ','; break; case AvailableDelimiters.Tab: CsvFileManager.Delimiter = '\t'; break; case AvailableDelimiters.Pipe: CsvFileManager.Delimiter = '|'; break; } string absoluteFileName = ProjectManager.MakeAbsolute(referencedFileSave.Name); // If the file doesn't exist this will generate bad code. But this isn't // considered a silent failure because Glue will raise flags about missing // files earlier (like when it first starts up). We don't want to crash the // entire application in this case. if (System.IO.File.Exists(absoluteFileName)) { RuntimeCsvRepresentation rcr = CsvFileManager.CsvDeserializeToRuntime(absoluteFileName); // See if any of the headers are required foreach (CsvHeader header in rcr.Headers) { int indexOfOpeningParen = header.Name.IndexOf("("); if (indexOfOpeningParen != -1) { if (header.Name.IndexOf("required", indexOfOpeningParen) != -1) { keyType = CsvHeader.GetClassNameFromHeader(header.Name); break; } } } } CsvFileManager.Delimiter = oldDelimiter; }
/// <summary> /// /// </summary> /// <param name="header">We ref this simply for performance reasons.</param> /// <param name="memberName"></param> /// <param name="type"></param> /// <param name="classType"></param> private static void GetTypeFromHeader(ref CsvHeader header, ref string memberName, out Type type, out string classType) { classType = ""; if (memberName.Contains("(")) { // The user is defining the type for this property classType = CsvHeader.GetClassNameFromHeader(header.Name); bool shouldBeNewed = false; if (classType.StartsWith("List<")) { classType = "System.Collections.Generic." + classType; shouldBeNewed = true; } if (string.IsNullOrEmpty(classType)) { // We can get here if the class is (required) type = typeof(string); } else { if (classType.Contains("<")) { ParsedType parsedType = new ParsedType(classType); type = TypeManager.GetTypeFromParsedType(parsedType); } else { type = TypeManager.GetTypeFromString(classType); } } memberName = StringFunctions.RemoveWhitespace(memberName); memberName = memberName.Substring(0, memberName.IndexOfAny(new char[] { '(' })); if (shouldBeNewed) { // The user probably wants these new'ed: memberName += " = new " + classType + "()"; } } else { memberName = StringFunctions.RemoveWhitespace(memberName); type = typeof(string); } }
public static object ConvertValueToType(object foundValue, string csvHeaderText) { if (csvHeaderText.Contains("(")) { // We should use whatever logic Glue uses here....and we should probably cache it so that it's fast string typeToConvertTo = CsvHeader.GetClassNameFromHeader(csvHeaderText); Type type = TypeManager.GetTypeFromString(typeToConvertTo); return(PropertyValuePair.ConvertStringToType((string)foundValue, type)); } else { return(foundValue); } }