using System.Collections.Generic;
public struct NotAnEnum: IConvertible
#region IConvertible Implementation
TypeCode IConvertible.GetTypeCode() { return TypeCode.Object; }
bool IConvertible.ToBoolean(IFormatProvider provider) { throw new NotImplementedException(); }
char IConvertible.ToChar(IFormatProvider provider) { throw new NotImplementedException(); }
sbyte IConvertible.ToSByte(IFormatProvider provider) { throw new NotImplementedException(); }
byte IConvertible.ToByte(IFormatProvider provider) { throw new NotImplementedException(); }
short IConvertible.ToInt16(IFormatProvider provider) { throw new NotImplementedException(); }
ushort IConvertible.ToUInt16(IFormatProvider provider) { throw new NotImplementedException(); }
int IConvertible.ToInt32(IFormatProvider provider) { throw new NotImplementedException(); }
uint IConvertible.ToUInt32(IFormatProvider provider) { throw new NotImplementedException(); }
long IConvertible.ToInt64(IFormatProvider provider) { throw new NotImplementedException(); }
ulong IConvertible.ToUInt64(IFormatProvider provider) { throw new NotImplementedException(); }
float IConvertible.ToSingle(IFormatProvider provider) { throw new NotImplementedException(); }
double IConvertible.ToDouble(IFormatProvider provider) { throw new NotImplementedException(); }
decimal IConvertible.ToDecimal(IFormatProvider provider) { throw new NotImplementedException(); }
DateTime IConvertible.ToDateTime(IFormatProvider provider) { throw new NotImplementedException(); }
string IConvertible.ToString(IFormatProvider provider) { throw new NotImplementedException(); }
object IConvertible.ToType(Type conversionType, IFormatProvider provider) { throw new NotImplementedException(); }
public static class EnumUtils
public static string ToSqlNullableString<T>(this List<T> list) where T : struct, IConvertible
throw new ArgumentException("T must be an enumerated type");
return string.Join(separator: ",", values: list.Select(_e => Convert.ToInt32(_e)));
public static void Main()
var enumList = new List<TestEnum>
TestEnum.Value0, TestEnum.Value0,
TestEnum.Value1, TestEnum.Value1,
TestEnum.Value2, TestEnum.Value2,
Console.WriteLine(enumList.ToSqlNullableString());
var notAnEnumList = new List<NotAnEnum>
Console.WriteLine(notAnEnumList.ToSqlNullableString());