Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在C#中的JsonProperty属性中使用资源字符串吗?_C#_Json_Serialization_Attributes_Json.net - Fatal编程技术网

我可以在C#中的JsonProperty属性中使用资源字符串吗?

我可以在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

我正在连接一个可能在未来几个月内进行重大修改的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
    }
}

你知道合同解决方法是否会对性能造成很大影响吗?@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);