diff --git a/src/index.ts b/src/index.ts
index 2da8a0d6eba01655adfd3edb28282925e3e2d455..f0a9323bd637fece6aebfb8ceafe81c1df534db1 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -23,3 +23,4 @@ export * from "./util/interval";
 export * from "./pab/pab_dimension";
 export * from "./pab/pab_puissance";
 export * from "./util/iterator";
+export * from "./util/enum";
diff --git a/src/util/enum.ts b/src/util/enum.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8c0186b4c1dd946353bbeebd804795f94580c321
--- /dev/null
+++ b/src/util/enum.ts
@@ -0,0 +1,45 @@
+/**
+ * classe d'itérateurs pour les enums
+ * cf. https://stackoverflow.com/questions/21293063/how-to-programmatically-enumerate-an-enum-type-in-typescript-0-9-5#21294925
+ 
+   utilisation : 
+
+    for (const v of EnumEx.getValues(MonTypeEnum)) {
+       console.log(v);
+    }
+
+    for (const n of EnumEx.getNames(MonTypeEnum)) {
+       console.log(n);
+    }
+
+    for (const c of EnumEx.getNamesAndValues(MonTypeEnum)) {
+       console.log(c.name);
+       console.log(c.value);
+    }
+ */
+export class EnumEx {
+    /**
+     * retourne les noms et les valeurs d'un enum
+     */
+    static getNamesAndValues<T extends number>(e: any) {
+        return EnumEx.getNames(e).map(n => ({ name: n, value: e[n] as T }));
+    }
+
+    /**
+     * retourne les noms d'un enum
+     */
+    static getNames(e: any) {
+        return EnumEx.getObjValues(e).filter(v => typeof v === "string") as string[];
+    }
+
+    /**
+     * retourne les valeurs d'un enum
+     */
+    static getValues<T extends number>(e: any) {
+        return EnumEx.getObjValues(e).filter(v => typeof v === "number") as T[];
+    }
+
+    private static getObjValues(e: any): (number | string)[] {
+        return Object.keys(e).map(k => e[k]);
+    }
+}