You can do this with a custom recognizer. In particular, you need to subclass DefaultContractResolver and override the GetSerializableMembers function:
public class StaticPropertyContractResolver : DefaultContractResolver { protected override List<MemberInfo> GetSerializableMembers(Type objectType) { var baseMembers = base.GetSerializableMembers(objectType); PropertyInfo[] staticMembers = objectType.GetProperties(BindingFlags.Static | BindingFlags.Public); baseMembers.AddRange(staticMembers); return baseMembers; } }
Here, all we do is call the base implementation of GetSerializableMembers , and then add the public static properties to our list of members for serialization.
To use it, you can create a new JsonSerializerSettings object and set ContractResolver to an instance of StaticPropertyContractResolver :
var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new StaticPropertyContractResolver();
Now pass these settings to JsonConvert.SerializeObject , and everything should work:
string json = JsonConvert.SerializeObject(new Settings(), serializerSettings);
Conclusion:
{ "IntSetting": 5, "StrSetting": "Test str" }
Example: https://dotnetfiddle.net/pswTJW
source share