0

我正在连接一个可能在未来几个月内进行重大修改的 API,并希望将相关的 API 标签存储在资源中,以确保在发生更改时可以轻松更新它们。

但是,当我尝试在 JsonProperty(通过 Newtonsoft)属性中使用这些资源字符串时,我遇到了以下错误:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

我已经尝试创建一个自定义属性来解决这个问题,但是 JsonProperty 本身是密封的并且是不可继承的。

我有一个合理的方法来解决这个问题吗?我只是错过了什么吗?

4

1 回答 1

2

控制您的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);
于 2013-03-05T23:28:53.880 回答