C # Método para combinar uma lista genérica de valores de enumeração para um único val
Eu quero passar umIEnumerable<T>
de valores de enumeração (enum possui o atributo Flags) e retorna o valor agregado. O método abaixo funciona, mas apenas se o enum usar o padrãoInt32
tipo. Se ele usabyte
ouInt64
não vai funcionar.
public static T ToCombined<T>(this IEnumerable<T> list) where T : struct
{
if (!typeof(T).IsEnum)
throw new ArgumentException("The generic type parameter must be an Enum.");
var values = list.Select(v => Convert.ToInt32(v));
var result = values.Aggregate((current, next) => current | next);
return (T)(object)result;
}
Sei que posso obter o tipo subjacente:
Type enumType = typeof(T);
Type underlyingType = Enum.GetUnderlyingType(enumType);
mas não vejo como fazer uso disso no método. Como posso criar o método de extensão para que ele possa lidar com uma lista de qualquerenums
com o atributo flags?
Melhor, mas pode ser um problema com UInts realmente grandes
public static T ToCombined<T>(this IEnumerable<T> list) where T : struct
{
if (!typeof(T).IsEnum)
throw new ArgumentException("The generic type parameter must be an Enum.");
var values = list.Select(v => Convert.ToInt64(v));
var result = values.Sum();
var underlyingType = Enum.GetUnderlyingType(typeof(T));
return (T)Convert.ChangeType(result, underlyingType);
}
Obrigado Andrew