2016-12-29 2 views
0

Json을 DataContract로 deserialize 할 목적으로 익명 메서드를 작성하려고합니다. 이렇게하면 각 json 쿼리에 대해 쓴 각 DataContract 클래스에 대해 동일한 코드를 작성하지 않고도 재사용 할 수있는 무언가를 가질 수 있습니다. 그것은 IDE 나에게 오류를주고있다문자열에서 DataContract로 json을 비 직렬화하는 메서드의 익명 형식

public T Json2Object<T>(string json, Encoding encoding) { 
    T result; 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
    using (Stream s = new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(json ?? ""))) { 
     result = ser.ReadObject(s) as T; 
    } 
    return result; 
} 

다음과 같습니다 :

error

이이 하드 -없이 조정할 수있는 방법을 다음과 같이

내가 지금까지 가지고있는 코드입니다 형식을 코딩하여 의도대로 작동합니까?

답변

1

키워드는 유형이 참조 유형이고 값 유형이 아님을 나타냅니다. 값 유형에 null을 저장할 수 없습니다. 따라서, 당신은 참조 유형으로 유형 T을 제한해야 하나 :

public T Json2Object<T>(string json, Encoding encoding) where T : class { 
    // ... 
} 

또는 캐스팅보다는 as를 사용

public T Json2Object<T>(string json, Encoding encoding) { 
    T result; 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
    using (Stream s = new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(json ?? ""))) { 
     result = (T)ser.ReadObject(s); 
    } 
    return result; 
} 
+0

아주 좋은, 감사합니다. 어디에서'T : class'를 사용하면'class'를 특정 클래스로 대체해야합니까? 예를 들어, 만약 datacontract 클래스의 이름이'Foo'라면'T : Foo' 또는''T : class'가 쓰여졌을 때 여전히 작동하겠습니까? –

+1

@KraangPrime 아니, 'T : class'는 정확히 당신이 쓴 것을 필요로합니다. 'T'를 * 참조 형 *으로 제한합니다. 'int'는 값 타입이기 때문에'Json2Object (someJson, someEncoding)'을 쓰는 것을 금지합니다. 'int'를 전달하려면, 대신 캐스팅 접근법을 사용해야합니다. – Rob

+1

정말 대단합니다. 정확히 내가 필요로하는 것. 고맙습니다 :) –

관련 문제