public static string ToLocalizedString <T>(T value, IStringLocalizer <T> localizer, Func <T, T, T> orFunc, Func <T, T, T> andNotFunc) where T : struct, Enum { var knownValues = (T[])_knownValues.GetOrAdd(typeof(T), GetKnownValues); StringBuilder sb = new StringBuilder(); T all = default; foreach (T resLocFlag in knownValues) { if (value.HasFlag(resLocFlag)) { if (sb.Length > 0) { sb.Append(", "); } sb.Append(localizer.GetStringOrFallback(resLocFlag.ToString())); } all = orFunc(all, resLocFlag); } T remainder = andNotFunc(value, all); if (EqualityComparer <T> .Default.Equals(remainder, default)) { if (sb.Length > 0) { sb.Append(", "); } sb.Append(remainder.ToString()); } return(sb.ToString()); }