Necesito un método que pueda recorrer todas las propiedades estáticas en una clase estática y combinarlas en una cadena con sintaxis json , donde el nombre de la clave sería igual al nombre de la propiedad y el valor de la clave sería el valor de la propiedad.
Entonces el resultado sería una cadena con valor:
{ "StaticPropertyName_string": "string_value_of_this_property", "StaticPropertyName_int": 34 }Tengo un método de trabajo que hace lo contrario con éxito: toma un json y asigna datos a campos estáticos. Pero no puedo entender cómo hacerlo al revés.
public static void MapProfileToJson(JToken source) //// source = plain json string { var destinationProperties = typeof(Fields) .GetProperties(BindingFlags.Public | BindingFlags.Static); foreach (JProperty prop in source) { var destinationProp = destinationProperties .SingleOrDefault(p => p.Name.Equals(prop.Name, StringComparison.OrdinalIgnoreCase)); var value = ((JValue)prop.Value).Value; if (typeof(Fields).GetProperty(prop.Name) != null) destinationProp.SetValue(null, Convert.ChangeType(value, destinationProp.PropertyType)); else Console.WriteLine("(!) property \"" + prop.Name + "\" is not found in class... skip"); } }Ejemplo de clase estática:
public static class Fields { public static bool BoolField { get; set; } public static string StringField { get; set; } public static int IntField { get; set; } public static double DoubleField { get; set; } }ps Los pares de valores clave guardados en una cadena, podrían envolverse al final como
ResultString = "{ " + resultString + " }";C# .NET 4.7.2 (aplicación de consola)
Como han dicho otros, una clase static no es un buen diseño aquí.
Sin embargo, es posible volver a asignarlo a JSON con una simple reflexión:
public static JObject MapStaticClassToJson(Type staticClassToMap) { var result = new JObject(); var properties = staticClassToMap.GetProperties(BindingFlags.Public | BindingFlags.Static); foreach (PropertyInfo prop in properties) { result.Add(new JProperty(prop.Name, prop.GetValue(null, null))); } return result; }Creo que sería bueno tener un código simple para asignar propiedades json a las propiedades de una clase estática también. Creé este código usando la respuesta de @RichardDeeming
public static void MapStaticClassFromJson(string json, Type staticClassToMap) { var jsonObject = JObject.Parse(json); var properties = staticClassToMap.GetProperties(BindingFlags.Public | BindingFlags.Static); foreach (PropertyInfo prop in properties) prop.SetValue(null, Convert.ChangeType(jsonObject[prop.Name], prop.PropertyType, CultureInfo.CurrentCulture), null); }prueba
MapStaticClassFromJson(json,typeof(Data)); Console.WriteLine(Data.StaticPropertyName_int); Console.WriteLine(Data.StaticPropertyName_string);resultado
34 string_value_of_this_property