/Mono.Cecil/GenericInstanceMethod.cs

http://github.com/jbevain/cecil · C# · 78 lines · 54 code · 15 blank · 9 comment · 3 complexity · 3c0c43c2e31cdab29d83bf8e5525e35c MD5 · raw file

  1. //
  2. // Author:
  3. // Jb Evain (jbevain@gmail.com)
  4. //
  5. // Copyright (c) 2008 - 2015 Jb Evain
  6. // Copyright (c) 2008 - 2011 Novell, Inc.
  7. //
  8. // Licensed under the MIT/X11 license.
  9. //
  10. using System;
  11. using System.Text;
  12. using System.Threading;
  13. using Mono.Collections.Generic;
  14. namespace Mono.Cecil {
  15. public sealed class GenericInstanceMethod : MethodSpecification, IGenericInstance, IGenericContext {
  16. Collection<TypeReference> arguments;
  17. public bool HasGenericArguments {
  18. get { return !arguments.IsNullOrEmpty (); }
  19. }
  20. public Collection<TypeReference> GenericArguments {
  21. get {
  22. if (arguments == null)
  23. Interlocked.CompareExchange (ref arguments, new Collection<TypeReference> (), null);
  24. return arguments;
  25. }
  26. }
  27. public override bool IsGenericInstance {
  28. get { return true; }
  29. }
  30. IGenericParameterProvider IGenericContext.Method {
  31. get { return ElementMethod; }
  32. }
  33. IGenericParameterProvider IGenericContext.Type {
  34. get { return ElementMethod.DeclaringType; }
  35. }
  36. public override bool ContainsGenericParameter {
  37. get { return this.ContainsGenericParameter () || base.ContainsGenericParameter; }
  38. }
  39. public override string FullName {
  40. get {
  41. var signature = new StringBuilder ();
  42. var method = this.ElementMethod;
  43. signature.Append (method.ReturnType.FullName)
  44. .Append (" ")
  45. .Append (method.DeclaringType.FullName)
  46. .Append ("::")
  47. .Append (method.Name);
  48. this.GenericInstanceFullName (signature);
  49. this.MethodSignatureFullName (signature);
  50. return signature.ToString ();
  51. }
  52. }
  53. public GenericInstanceMethod (MethodReference method)
  54. : base (method)
  55. {
  56. }
  57. internal GenericInstanceMethod (MethodReference method, int arity)
  58. : this (method)
  59. {
  60. this.arguments = new Collection<TypeReference> (arity);
  61. }
  62. }
  63. }