我正在连接一个可能在未来几个月进行重大修改的API,并且希望将相关的API标记存储在资源中,以确保在发生更改时可以轻松更新它们。
当我尝试在JsonProperty(通过Newtonsoft)属性中使用这些资源字符串时,然而,我遇到了以下错误:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我已经尝试创建一个自定义属性来解决这个问题,但JsonProperty本身是密封的,是不可继承的。
有什么合理的方法可以让我处理这件事吗?我是不是错过了什么?
JsonPropertyAttribute
控制如何将您的类序列化为JSON并返回。如果您在资源文件中定义了实际的json属性名,那么您的类的序列化方式将随着这些资源文件的更新而改变,或者即使您的应用程序只是切换到不同的语言环境。这通常不是一个好主意。
然而,如果你的程序变化如此频繁,以至于你希望能够在不重新编译的情况下修改类的序列化,或者如果你想有多种方式序列化你的类,我相信你必须编写自己的IContractResolver
。
下面是一个例子:
public class ResourceNameContractResolver :
CamelCasePropertyNamesContractResolver
{
protected override IList<JsonProperty> CreateProperties CreatePropertiesInternal(Type type, MemberSerialization memberSerialization)
{
var list = base.CreateProperties(type, memberSerialization)
foreach (JsonProperty p in list)
{
p.PropertyName = this.GetRealNameFromResourceFile(p.PropertyName);
}
return list;
}
private string GetRealNameFromResourceFile(string originalPropertyName)
{
// Look up name from resource file
}
}
使用这个类
var settings = new JsonSerializerSettings()
{
ContractResolver = new ResourceNameContractResolver()
};
JsonTextWriter writer = new JsonTextWriter(...);
JsonSerializer serializer = JsonSerializer.Create(settings);
serializer.Serialize(writer, myData);