Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper-如何从显示名称正确解析枚举_C#_Enums_Dapper - Fatal编程技术网

C# Dapper-如何从显示名称正确解析枚举

C# Dapper-如何从显示名称正确解析枚举,c#,enums,dapper,C#,Enums,Dapper,我正在使用Dapper查询数据库中的枚举。问题在于,当将枚举写入数据库时,将写入显示名称,而不是值(因为数据库列的值是向用户显示的,不会改变)。对于某些值,名称和枚举值相同(在这种情况下,代码中省略名称),但对于其他值,名称和枚举值不同。这导致难以解析枚举 示例代码: public enum Game { Uninitialized = 0, // Display name omitted since it would be identical Monopoly = 1,

我正在使用Dapper查询数据库中的枚举。问题在于,当将枚举写入数据库时,将写入显示名称,而不是值(因为数据库列的值是向用户显示的,不会改变)。对于某些值,名称和枚举值相同(在这种情况下,代码中省略名称),但对于其他值,名称和枚举值不同。这导致难以解析枚举

示例代码:

public enum Game
{
    Uninitialized = 0,
    // Display name omitted since it would be identical
    Monopoly = 1,
    [Display(Name = "Ticket to Ride")]
    TicketToRide = 2,
}


使用var conn=newsqlconnection(/*连接字符串*/);
尝试
{
//显然不是真正的疑问
var dbResults=conn.Query($“选择‘乘车票’作为{nameof(ClassWithGame.Game)}’”)。First();
}
捕获(例外e)
{
//异常:分析列0时出错(Game=Ticket to Ride-String)--->System.ArgumentException:未找到请求的值“Ticket to Ride”。
}
我见过实现
SqlMapper.ITypeHandler
的Dapper自定义类型处理程序,甚至尝试编写/使用一个,但该值仍然无法解析(尽管我得到了不同的异常)。鉴于该值仍然没有解析,我省略了编写自定义处理程序的失败尝试


我的问题是:如何正确地将枚举名称解析为正确的值?

您的数据库中存储了“to Ride”并在代码中使用枚举?这对我来说很奇怪。如果添加新游戏会发生什么?假设您添加了灰暗港,您将需要添加一个新的枚举值,它看起来相当脆弱。@DavidG首先,这是一个非常好的游戏选择!事实上,我现在已经在厨房的桌子上摆好了灰暗的天堂!爱死它了!您是对的,添加另一个游戏需要添加另一个枚举值,从这个意义上讲,它是相当脆弱的。如果可以这样说的话,令人欣慰的是,在这个枚举存在10年的时间里,我们只向它添加了一次值,所以它相对“稳定”。也许你应该创建一个类型,使用一个字符串属性作为枚举名,另一个属性是enum.parse getter中的名称。在你简洁的查询中使用这种类型。我想说的是,为什么不把游戏作为一个查找表存储在数据库(ID,描述)中呢。那么就不需要再摆弄枚举了。(顺便说一句,对不起,我没有玩过灰暗港游戏!什么样的严肃玩家每10年才添加一个新游戏?:)
public class ClassWithGame
{
    public Game Game;
}
using var conn = new SqlConnection(/* Connection string */);
try
{
    // Obviously not the real query
    var dbResults = conn.Query<ClassWithGame>($"SELECT 'Ticket to Ride' AS '{nameof(ClassWithGame.Game)}'").First();
}
catch (Exception e)
{
    // Exception: Error parsing column 0 (Game=Ticket to Ride - String) ---> System.ArgumentException: Requested value 'Ticket to Ride' was not found.
}