我可以在C#中的JsonProperty属性中使用资源字符串吗?
我正在连接一个可能在未来几个月内进行重大修改的API,并希望将相关的API标记存储在一个资源中,以确保在发生更改时可以轻松更新它们 但是,当我尝试在JsonProperty(通过Newtonsoft)属性中使用这些资源字符串时,我遇到了以下错误:我可以在C#中的JsonProperty属性中使用资源字符串吗?,c#,json,serialization,attributes,json.net,C#,Json,Serialization,Attributes,Json.net,我正在连接一个可能在未来几个月内进行重大修改的API,并希望将相关的API标记存储在一个资源中,以确保在发生更改时可以轻松更新它们 但是,当我尝试在JsonProperty(通过Newtonsoft)属性中使用这些资源字符串时,我遇到了以下错误: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter
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
}
}
你知道合同解决方法是否会对性能造成很大影响吗?@Maixy我无法想象对性能的影响会很大。最大的打击来自每次从res文件中查找属性名称,尽管第一次尝试将整个res文件读入内存可以加快速度。好的,非常感谢您的输入和快速响应!对于这种情况来说,似乎最好的方法是将字符串硬编码为类中的const,并期望在每次API更改时更新/重新编译它们。
var settings = new JsonSerializerSettings()
{
ContractResolver = new ResourceNameContractResolver()
};
JsonTextWriter writer = new JsonTextWriter(...);
JsonSerializer serializer = JsonSerializer.Create(settings);
serializer.Serialize(writer, myData);