gpt4 book ai didi

c# - 检查什么类型的枚举进入了通用方法

转载 作者:行者123 更新时间:2023-11-30 21:03:08 24 4
gpt4 key购买 nike

我现在想检查传入的列以查看它是什么类型的枚举,并基于此返回该列的正确数据库类型。我无法让它工作,不知道如何:

  public DbType GetColumnDbType<T>(T column) where T: IComparable, IFormattable, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("the object passed in must an enum type");


switch (column)
{
case (Enums.MemberColumn)column:
switch (Enums.MemberColumn)
{
case Enums.MemberColumn.Address1:
return DbType.String;
break;
case Enums.MemberColumn.City:
return DbType.String;
break;
case Enums.MemberColumn.State:
return DbType.String;
break;
}
}
.....

更新

这是我尝试过的,但编译器在第一行提示说“期望整数类型的值”

    switch(typeof(T))
{
case (typeof (Enums.MemberColumn)):
switch ((Enums.MemberColumn) column)
{
case Enums.MemberColumn.Address1:
return DbType.String;
break;
case Enums.MemberColumn.City:
return DbType.String;
break;
case Enums.MemberColumn.State:
return DbType.String;
break;
default:
throw new ArgumentException("Unsupported enum type.", "MemberColumn");
break;
}
}

最佳答案

我觉得你的 switch 语句有点可笑。试试这个:

        if (typeof(T) == typeof(Enums.MemberColumn))
{
switch ((Enums.MemberColumn)column)
{
case Enums.MemberColumn.Address1:

....

正如其他人所建议的那样,如果您要根据其类型进行切换,那么使用泛型方法有什么意义呢?只需这样做:

public DbType GetColumnDbType(Enums.MemberColumn column)
{
switch(column)
{
case (Enums.MemberColumn.Address1):

....

}

然后为其他枚举类型创建另一个重载方法:

public DbType GetColumnDbType(Enums.OtherMemberColumn column)
{
switch(column)
{
.....
}

}

或者...我会这样做的方式:

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class DbTypeAttribute : Attribute
{
public DbType DbType { get; private set; }

public DbTypeAttribute(DbType dbType)
{
this.DbType = dbType;
}
}

public static class DbHelper<T> where T : IComparable, IFormattable, IConvertible, struct
{
private static Dictionary<long, DbType> _dbTypeLookup = CreateLookup();

public static DbType GetColumnType(T column)
{
return _dbTypeLookup[(long)(object)column];
}

private static Dictionary<long, DbType> CreateLookup()
{
if (!typeof(T).IsEnum)
throw new InvalidOperationException("T must be an enum type.");

var dbTypeLookup = new Dictionary<long, DbType>();

foreach (var name in Enum.GetNames(typeof(T)))
{
var enumMember = typeof(T).GetMember(name).Single();
var dbTypeAttr = (DbTypeAttribute)enumMember.GetCustomAttributes(typeof(DbTypeAttribute), false).Single();

dbTypeLookup.Add((long)Enum.Parse(typeof(T), name), dbTypeAttr.DbType);
}

return dbTypeLookup;
}
}

有了上面的代码,我现在可以这样做了:

public enum MemberColumn
{
[DbType(DbType.String)] Address1,
[DbType(DbType.String)] Address2,
[DbType(DbType.String)] FirstName,
[DbType(DbType.String)] LastName,
[DbType(DbType.DateTime)] DateOfBirth,
}


// ... later, in some method somewhere:

MemberColumn c = MemberColumn.Address1;

DbType dbType = DbHelper<MemberColumn>.GetColumnType(c); // sets dbType to DbType.String

关于c# - 检查什么类型的枚举进入了通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13018378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com