关于WCF中的疑难杂症 -- 泛型类型
最近想做一个项目,考虑到需要根据用户有可能会提供不同类型的数据所以用到了泛型来实现其功能:通过RptParameters的不同方法,加入不同类型的值,并且保存在Dictionary中,由于Dictionary中的第二个参数只能以object来包含不同类型的值,这就需在WCF进行序列化时为其指明KnowTyp属性,由于属性标示要求是具体的类型,而类型只能在用户使用时才能确定,这就出现了矛盾。全部代码如下,问题出在下面代码红色部分,不能正常标示泛型属性。
上面代码中红色字体部分,是需要完善的地方,如果去掉注释会出现如下图的错误传到不能编译通过,如果不加上,WCF序列化则不能通过。
暂时放在首页,希望版主手下留情。这是WCF中的扩展应用,相信会有同样的问题发生在朋友身边
各位高手有同样的案例吗,你是怎么解决的?请多多交流。
1 [DataContract]
2 public class RptValue<T> { }
3
4
5 [DataContract]
6 public class RptSingleValue<T> : RptValue<T>
7 {
8 private T _value;
9
10 [DataMember]
11 public T Value
12 {
13 get { return _value; }
14 set { _value = value; }
15 }
16
17 }
18
19
20 [DataContract]
21 public class RptFromToValue<T> : RptValue<T>
22 {
23
24 private T _fvalue;
25
26 [DataMember]
27 public T FromValue
28 {
29 get { return _fvalue; }
30 set { _fvalue = value; }
31 }
32
33
34 private T _tvalue;
35
36 [DataMember]
37 public T ToValue
38 {
39 get { return _tvalue; }
40 set { _tvalue = value; }
41 }
42
43 }
44
45
46 //[KnownType(typeof(RptSingleValue))]
47 //[KnownType(typeof(RptFromToValue))]
48 //[KnownType(typeof(RptValue))]
49 [DataContract]
50 public class RptParameters
51 {
52 private Dictionary<string,object> _datas=new Dictionary<string,object>();
53
54 [DataMember]
55 public Dictionary<string,object> Data
56 {
57 get { return _datas; }
58 set { _datas = value; }
59 }
60
61 public void AddSingleValue<T>(string name,T value){
62 if (!this._datas.ContainsKey(name))
63 {
64 RptSingleValue<T> rs = new RptSingleValue<T>();
65 rs.Value = value;
66 this._datas.Add(name, rs);
67 }
68 }
69
70
71 public void AddFromToValue<T>(string name,T fromValue,T toValue)
72 {
73 if (!this._datas.ContainsKey(name))
74 {
75 RptFromToValue<T> rft = new RptFromToValue<T>();
76 rft.FromValue = fromValue;
77 rft.ToValue = toValue;
78 this._datas.Add(name,rft);
79 }
80 }
81 }
2 public class RptValue<T> { }
3
4
5 [DataContract]
6 public class RptSingleValue<T> : RptValue<T>
7 {
8 private T _value;
9
10 [DataMember]
11 public T Value
12 {
13 get { return _value; }
14 set { _value = value; }
15 }
16
17 }
18
19
20 [DataContract]
21 public class RptFromToValue<T> : RptValue<T>
22 {
23
24 private T _fvalue;
25
26 [DataMember]
27 public T FromValue
28 {
29 get { return _fvalue; }
30 set { _fvalue = value; }
31 }
32
33
34 private T _tvalue;
35
36 [DataMember]
37 public T ToValue
38 {
39 get { return _tvalue; }
40 set { _tvalue = value; }
41 }
42
43 }
44
45
46 //[KnownType(typeof(RptSingleValue))]
47 //[KnownType(typeof(RptFromToValue))]
48 //[KnownType(typeof(RptValue))]
49 [DataContract]
50 public class RptParameters
51 {
52 private Dictionary<string,object> _datas=new Dictionary<string,object>();
53
54 [DataMember]
55 public Dictionary<string,object> Data
56 {
57 get { return _datas; }
58 set { _datas = value; }
59 }
60
61 public void AddSingleValue<T>(string name,T value){
62 if (!this._datas.ContainsKey(name))
63 {
64 RptSingleValue<T> rs = new RptSingleValue<T>();
65 rs.Value = value;
66 this._datas.Add(name, rs);
67 }
68 }
69
70
71 public void AddFromToValue<T>(string name,T fromValue,T toValue)
72 {
73 if (!this._datas.ContainsKey(name))
74 {
75 RptFromToValue<T> rft = new RptFromToValue<T>();
76 rft.FromValue = fromValue;
77 rft.ToValue = toValue;
78 this._datas.Add(name,rft);
79 }
80 }
81 }
上面代码中红色字体部分,是需要完善的地方,如果去掉注释会出现如下图的错误传到不能编译通过,如果不加上,WCF序列化则不能通过。
暂时放在首页,希望版主手下留情。这是WCF中的扩展应用,相信会有同样的问题发生在朋友身边
各位高手有同样的案例吗,你是怎么解决的?请多多交流。