2013-03-05 1 views
0

향후 수개월 내에 크게 수정 될 가능성이있는 API에 연결하고 관련 API 태그를 리소스에 저장하여 변경 사항이 발생했을 때 쉽게 업데이트 할 수 있는지 확인하고자합니다. 나는이 문제를 해결하기 위해 사용자 지정 특성을 만드는 시도C#의 JsonProperty 속성에서 리소스 문자열을 사용할 수 있습니까?

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

:하지만, 나는 그러나, (Newtonsoft을 통해) JsonProperty 속성에 이러한 리소스 문자열을 사용하려고하면

, 나는 다음과 같은 오류로 실행 JsonProperty 자체는 봉인되어 있으며 상속받을 수 없습니다.

이 접근 방법이 있습니까? 방금 뭔가 빠졌나요?

답변

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); 
+0

을 사용하기 : 여기

은 예입니다? – Maixy

+0

@Mixix 성능에 미치는 영향이 매우 클 것이라고 상상할 수 없습니다. 가장 큰 히트는 매번 res 파일에서 속성 이름을 찾는 것에서 나온 것이지만, 처음 시도에서 전체 res 파일을 메모리로 읽음으로써 속도가 빨라질 수는 있습니다. –

+0

입력하신 내용과 빠른 답변을 보내 주셔서 감사합니다. 이 상황에서 가장 좋은 접근법은 클래스 내에서 문자열을 const로 하드 코딩하고 각 API 변경시 해당 문자열을 업데이트/다시 컴파일 할 것을 기대하는 것입니다. – Maixy

관련 문제