EnumDescription.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: EnumDescription.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. */
  5. using System;
  6. using System.Collections;
  7. using System.Reflection;
  8. namespace Poderosa.Toolkit {
  9. //惍悢偺enum抣偵昞婰傪偮偗偨傝憡屳曄姺偟偨傝偡傞丂峔憿忋
  10. [AttributeUsage(AttributeTargets.Enum)]
  11. public class EnumDescAttribute : Attribute {
  12. #if MACRODOC
  13. public EnumDescAttribute(Type t) {
  14. }
  15. #else
  16. private static Hashtable _assemblyToResource = new Hashtable(4); //彫偝偄僥乕僽儖偱傛偄
  17. public static void AddResourceTable(Assembly asm, StringResources res) {
  18. _assemblyToResource[asm] = res; //overwrite if the key is duplicated
  19. }
  20. private string[] _descriptions;
  21. private Hashtable _descToValue;
  22. private string[] _names;
  23. private Hashtable _nameToValue;
  24. private StringResources _strResource;
  25. public EnumDescAttribute(Type t) {
  26. _strResource = (StringResources)_assemblyToResource[t.Assembly];
  27. if(_strResource==null) throw new Exception("String resource is not found");
  28. Init(t);
  29. }
  30. public void Init(Type t) {
  31. MemberInfo[] ms = t.GetMembers();
  32. _descToValue = new Hashtable(ms.Length);
  33. _nameToValue = new Hashtable(ms.Length);
  34. ArrayList descriptions = new ArrayList(ms.Length);
  35. ArrayList names = new ArrayList(ms.Length);
  36. int expected = 0;
  37. foreach(MemberInfo mi in ms) {
  38. FieldInfo fi = mi as FieldInfo;
  39. if(fi!=null && fi.IsStatic && fi.IsPublic) {
  40. int intVal = (int)fi.GetValue(null); //int埲奜傪儀乕僗偵偟偰偄傞Enum抣偼僒億乕僩奜
  41. if(intVal!=expected) throw new Exception("unexpected enum value order");
  42. EnumValueAttribute a = (EnumValueAttribute)(fi.GetCustomAttributes(typeof(EnumValueAttribute), false)[0]);
  43. string desc = a.Description;
  44. descriptions.Add(desc);
  45. _descToValue[desc] = intVal;
  46. string name = fi.Name;
  47. names.Add(name);
  48. _nameToValue[name] = intVal;
  49. expected++;
  50. }
  51. }
  52. _descriptions = (string[])descriptions.ToArray(typeof(string));
  53. _names        = (string[])names.ToArray(typeof(string));
  54. }
  55. public virtual string GetDescription(ValueType i) {
  56. return LoadString(_descriptions[(int)i]);
  57. }
  58. public virtual ValueType FromDescription(string v, ValueType d) {
  59. if(v==null) return d;
  60. IDictionaryEnumerator ie = _descToValue.GetEnumerator();
  61. while(ie.MoveNext()) {
  62. if(v==LoadString((string)ie.Key)) return (ValueType)ie.Value;
  63. }
  64. return d;
  65. }
  66. public virtual string GetName(ValueType i) {
  67. return _names[(int)i];
  68. }
  69. public virtual ValueType FromName(string v) {
  70. return (ValueType)_nameToValue[v];
  71. }
  72. public virtual ValueType FromName(string v, ValueType d) {
  73. if(v==null) return d;
  74. ValueType t = (ValueType)_nameToValue[v];
  75. return t==null? d : t;
  76. }
  77. public virtual string[] DescriptionCollection() {
  78. string[] r = new string[_descriptions.Length];
  79. for(int i=0; i<r.Length; i++)
  80. r[i] = LoadString(_descriptions[i]);
  81. return r;
  82. }
  83. private string LoadString(string id) {
  84. string t = _strResource.GetString(id);
  85. return t==null? id : t;
  86. }
  87. //傾僩儕價儏乕僩傪庢摼偡傞
  88. private static Hashtable _typeToAttr = new Hashtable();
  89. public static EnumDescAttribute For(Type type) {
  90. EnumDescAttribute a = _typeToAttr[type] as EnumDescAttribute;
  91. if(a==null) {
  92. a = (EnumDescAttribute)(type.GetCustomAttributes(typeof(EnumDescAttribute), false)[0]);
  93. _typeToAttr.Add(type, a);
  94. }
  95. return a;
  96. }
  97. #endif
  98. }
  99. [AttributeUsage(AttributeTargets.Field)]
  100. public class EnumValueAttribute : Attribute {
  101. private string _description;
  102. public string Description {
  103. get {
  104. return _description;
  105. }
  106. set {
  107. _description = value;
  108. }
  109. }
  110. }
  111. }