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

questionAnswers(3)

yourAnswerToTheQuestion