PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/WCFWebApi/src/Microsoft.Runtime.Serialization.Internal/Microsoft/Runtime/Serialization/DataMember.cs

#
C# | 330 lines | 289 code | 37 blank | 4 comment | 28 complexity | 2f38e36e1f315fd3f06885b4c246711a MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace Microsoft.Runtime.Serialization
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics.CodeAnalysis;
  9. using System.Reflection;
  10. using System.Security;
  11. using Microsoft.Server.Common;
  12. class DataMember
  13. {
  14. [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
  15. + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
  16. [SecurityCritical]
  17. CriticalHelper helper;
  18. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  19. Safe = "Doesn't leak anything.")]
  20. [SecuritySafeCritical]
  21. internal DataMember()
  22. {
  23. helper = new CriticalHelper();
  24. }
  25. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  26. Safe = "Doesn't leak anything.")]
  27. [SecuritySafeCritical]
  28. internal DataMember(MemberInfo memberInfo)
  29. {
  30. helper = new CriticalHelper(memberInfo);
  31. }
  32. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  33. Safe = "Doesn't leak anything.")]
  34. [SecuritySafeCritical]
  35. internal DataMember(string name)
  36. {
  37. helper = new CriticalHelper(name);
  38. }
  39. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  40. Safe = "Doesn't leak anything.")]
  41. [SecuritySafeCritical]
  42. internal DataMember(DataContract memberTypeContract, string name, bool isNullable, bool isRequired, bool emitDefaultValue, int order)
  43. {
  44. helper = new CriticalHelper(memberTypeContract, name, isNullable, isRequired, emitDefaultValue, order);
  45. }
  46. internal MemberInfo MemberInfo
  47. {
  48. [SecuritySafeCritical]
  49. get { return helper.MemberInfo; }
  50. }
  51. internal string Name
  52. {
  53. [SecuritySafeCritical]
  54. get { return helper.Name; }
  55. [SecurityCritical]
  56. set { helper.Name = value; }
  57. }
  58. internal int Order
  59. {
  60. [SecuritySafeCritical]
  61. get { return helper.Order; }
  62. [SecurityCritical]
  63. set { helper.Order = value; }
  64. }
  65. internal bool IsRequired
  66. {
  67. [SecuritySafeCritical]
  68. get { return helper.IsRequired; }
  69. [SecurityCritical]
  70. set { helper.IsRequired = value; }
  71. }
  72. internal bool EmitDefaultValue
  73. {
  74. [SecuritySafeCritical]
  75. get { return helper.EmitDefaultValue; }
  76. [SecurityCritical]
  77. set { helper.EmitDefaultValue = value; }
  78. }
  79. internal bool IsNullable
  80. {
  81. [SecuritySafeCritical]
  82. get { return helper.IsNullable; }
  83. [SecurityCritical]
  84. set { helper.IsNullable = value; }
  85. }
  86. internal bool IsGetOnlyCollection
  87. {
  88. [SecuritySafeCritical]
  89. get { return helper.IsGetOnlyCollection; }
  90. [SecurityCritical]
  91. set { helper.IsGetOnlyCollection = value; }
  92. }
  93. internal Type MemberType
  94. {
  95. [SecuritySafeCritical]
  96. get { return helper.MemberType; }
  97. }
  98. internal DataContract MemberTypeContract
  99. {
  100. [SecuritySafeCritical]
  101. get { return helper.MemberTypeContract; }
  102. [SecurityCritical]
  103. set { helper.MemberTypeContract = value; }
  104. }
  105. internal bool HasConflictingNameAndType
  106. {
  107. [SecuritySafeCritical]
  108. get { return helper.HasConflictingNameAndType; }
  109. [SecurityCritical]
  110. set { helper.HasConflictingNameAndType = value; }
  111. }
  112. internal DataMember ConflictingMember
  113. {
  114. [SecuritySafeCritical]
  115. get { return helper.ConflictingMember; }
  116. [SecurityCritical]
  117. set { helper.ConflictingMember = value; }
  118. }
  119. [Fx.Tag.SecurityNote(Miscellaneous = "RequiresReview - checks member visibility to calculate if access to it requires MemberAccessPermission for serialization."
  120. + " Since this information is used to determine whether to give the generated code access"
  121. + " permissions to private members, any changes to the logic should be reviewed.")]
  122. internal bool RequiresMemberAccessForGet()
  123. {
  124. MemberInfo memberInfo = MemberInfo;
  125. FieldInfo field = memberInfo as FieldInfo;
  126. if (field != null)
  127. {
  128. return DataContract.FieldRequiresMemberAccess(field);
  129. }
  130. else
  131. {
  132. PropertyInfo property = (PropertyInfo)memberInfo;
  133. MethodInfo getMethod = property.GetGetMethod(true /*nonPublic*/);
  134. if (getMethod != null)
  135. return DataContract.MethodRequiresMemberAccess(getMethod) || !DataContract.IsTypeVisible(property.PropertyType);
  136. }
  137. return false;
  138. }
  139. [Fx.Tag.SecurityNote(Critical = "Critical.")]
  140. [SecurityCritical]
  141. class CriticalHelper
  142. {
  143. DataContract memberTypeContract;
  144. string name;
  145. int order;
  146. bool isRequired;
  147. bool emitDefaultValue;
  148. bool isNullable;
  149. bool isGetOnlyCollection = false;
  150. MemberInfo memberInfo;
  151. bool hasConflictingNameAndType;
  152. DataMember conflictingMember;
  153. [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily", Justification = "This is cloned code.")]
  154. internal CriticalHelper()
  155. {
  156. this.emitDefaultValue = Globals.DefaultEmitDefaultValue;
  157. }
  158. [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily", Justification = "This is cloned code.")]
  159. internal CriticalHelper(MemberInfo memberInfo)
  160. {
  161. this.emitDefaultValue = Globals.DefaultEmitDefaultValue;
  162. this.memberInfo = memberInfo;
  163. }
  164. [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily", Justification = "This is cloned code.")]
  165. internal CriticalHelper(string name)
  166. {
  167. this.Name = name;
  168. }
  169. [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily", Justification = "This is cloned code.")]
  170. internal CriticalHelper(DataContract memberTypeContract, string name, bool isNullable, bool isRequired, bool emitDefaultValue, int order)
  171. {
  172. this.MemberTypeContract = memberTypeContract;
  173. this.Name = name;
  174. this.IsNullable = isNullable;
  175. this.IsRequired = isRequired;
  176. this.EmitDefaultValue = emitDefaultValue;
  177. this.Order = order;
  178. }
  179. internal MemberInfo MemberInfo
  180. {
  181. get { return memberInfo; }
  182. }
  183. internal string Name
  184. {
  185. get { return name; }
  186. set { name = value; }
  187. }
  188. internal int Order
  189. {
  190. get { return order; }
  191. set { order = value; }
  192. }
  193. internal bool IsRequired
  194. {
  195. get { return isRequired; }
  196. set { isRequired = value; }
  197. }
  198. internal bool EmitDefaultValue
  199. {
  200. get { return emitDefaultValue; }
  201. set { emitDefaultValue = value; }
  202. }
  203. internal bool IsNullable
  204. {
  205. get { return isNullable; }
  206. set { isNullable = value; }
  207. }
  208. internal bool IsGetOnlyCollection
  209. {
  210. get { return isGetOnlyCollection; }
  211. set { isGetOnlyCollection = value; }
  212. }
  213. internal Type MemberType
  214. {
  215. get
  216. {
  217. FieldInfo field = MemberInfo as FieldInfo;
  218. if (field != null)
  219. return field.FieldType;
  220. return ((PropertyInfo)MemberInfo).PropertyType;
  221. }
  222. }
  223. internal DataContract MemberTypeContract
  224. {
  225. get
  226. {
  227. if (memberTypeContract == null)
  228. {
  229. if (MemberInfo != null)
  230. {
  231. if (this.IsGetOnlyCollection)
  232. {
  233. memberTypeContract = DataContract.GetGetOnlyCollectionDataContract(DataContract.GetId(MemberType.TypeHandle), MemberType.TypeHandle, MemberType, SerializationMode.SharedContract);
  234. }
  235. else
  236. {
  237. memberTypeContract = DataContract.GetDataContract(MemberType);
  238. }
  239. }
  240. }
  241. return memberTypeContract;
  242. }
  243. set
  244. {
  245. memberTypeContract = value;
  246. }
  247. }
  248. internal bool HasConflictingNameAndType
  249. {
  250. get { return this.hasConflictingNameAndType; }
  251. set { this.hasConflictingNameAndType = value; }
  252. }
  253. internal DataMember ConflictingMember
  254. {
  255. get { return this.conflictingMember; }
  256. set { this.conflictingMember = value; }
  257. }
  258. }
  259. internal DataMember BindGenericParameters(DataContract[] paramContracts, Dictionary<DataContract, DataContract> boundContracts)
  260. {
  261. DataContract memberTypeContract = this.MemberTypeContract.BindGenericParameters(paramContracts, boundContracts);
  262. DataMember boundDataMember = new DataMember(memberTypeContract,
  263. this.Name,
  264. !memberTypeContract.IsValueType,
  265. this.IsRequired,
  266. this.EmitDefaultValue,
  267. this.Order);
  268. return boundDataMember;
  269. }
  270. internal bool Equals(object other, Dictionary<DataContractPairKey, object> checkedContracts)
  271. {
  272. if ((object)this == other)
  273. return true;
  274. DataMember dataMember = other as DataMember;
  275. if (dataMember != null)
  276. {
  277. // Note: comparison does not use Order hint since it influences element order but does not specify exact order
  278. bool thisIsNullable = (MemberTypeContract == null) ? false : !MemberTypeContract.IsValueType;
  279. bool dataMemberIsNullable = (dataMember.MemberTypeContract == null) ? false : !dataMember.MemberTypeContract.IsValueType;
  280. return (Name == dataMember.Name
  281. && (IsNullable || thisIsNullable) == (dataMember.IsNullable || dataMemberIsNullable)
  282. && IsRequired == dataMember.IsRequired
  283. && EmitDefaultValue == dataMember.EmitDefaultValue
  284. && MemberTypeContract.Equals(dataMember.MemberTypeContract, checkedContracts));
  285. }
  286. return false;
  287. }
  288. public override int GetHashCode()
  289. {
  290. return base.GetHashCode();
  291. }
  292. }
  293. }