GenericParameterDataContract.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.Runtime.Serialization
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Security;
  9. sealed class GenericParameterDataContract : DataContract
  10. {
  11. [Fx.Tag.SecurityNote(Critical = "Holds instance of CriticalHelper which keeps state that is cached statically for serialization."
  12. + " Static fields are marked SecurityCritical or readonly to prevent data from being modified or leaked to other components in appdomain.")]
  13. [SecurityCritical]
  14. GenericParameterDataContractCriticalHelper helper;
  15. [Fx.Tag.SecurityNote(Critical = "Initializes SecurityCritical field 'helper'.",
  16. Safe = "Doesn't leak anything.")]
  17. [SecuritySafeCritical]
  18. internal GenericParameterDataContract(Type type)
  19. : base(new GenericParameterDataContractCriticalHelper(type))
  20. {
  21. helper = base.Helper as GenericParameterDataContractCriticalHelper;
  22. }
  23. internal int ParameterPosition
  24. {
  25. [Fx.Tag.SecurityNote(Critical = "Fetches the critical ParameterPosition property.",
  26. Safe = "ParameterPosition only needs to be protected for write.")]
  27. [SecuritySafeCritical]
  28. get { return helper.ParameterPosition; }
  29. }
  30. internal override bool IsBuiltInDataContract
  31. {
  32. get
  33. {
  34. return true;
  35. }
  36. }
  37. [Fx.Tag.SecurityNote(Critical = "Holds state used for deaing with generic parameters."
  38. + " Since the data is cached statically, we lock down access to it.")]
  39. #if !NO_SECURITY_ATTRIBUTES
  40. [SecurityCritical(SecurityCriticalScope.Everything)]
  41. #endif
  42. class GenericParameterDataContractCriticalHelper : DataContract.DataContractCriticalHelper
  43. {
  44. int parameterPosition;
  45. internal GenericParameterDataContractCriticalHelper(Type type)
  46. : base(type)
  47. {
  48. SetDataContractName(DataContract.GetStableName(type));
  49. this.parameterPosition = type.GenericParameterPosition;
  50. }
  51. internal int ParameterPosition
  52. {
  53. get { return parameterPosition; }
  54. }
  55. }
  56. internal override DataContract BindGenericParameters(DataContract[] paramContracts, Dictionary<DataContract, DataContract> boundContracts)
  57. {
  58. return paramContracts[ParameterPosition];
  59. }
  60. }
  61. }