我在我的代码中编写了一些“数据类型嗅探”,它只是感觉不对,就像C#中有一些显而易见的功能,我忘了它应该允许我避免做这样的语句:
if(dbType == DbType.String)
if(Convert.ToString(myVar) == Convert.ToString(myOtherVar))
doSomethingUseful();
else if(dbType == DbType.Int32)
if(Convert.ToInt32(myVar) == Convert.ToInt32(myOtherVar))
doSomethingUseful();
(具体来说,我正在使用listBoxes
,有时会有Int
个值和其他String
个值。)
似乎应该有一个Convert.ToDbType(myVar, unknownDbType)
功能,或者某种方式在这里使用泛型。我正在寻找更好的道路。
答案 0 :(得分:1)
我不认为.NET中的DbType
和Type
之间存在内置映射,但您可以自行编写:
private static readonly IDictionary<DbType,Type> DbTypeToType =
new Dictionary<DbType,Type> {
{ DbType.String, typeof(string) }
, { DbType.Int32, typeof(int) }
, ... // Add more types as needed
};
现在您可以按如下方式进行比较:
var t = DbTypeToType[dbType];
if (Equals(Convert.ChangeType(myVar, t), Convert.ChangeType(myOtherVar, t))) {
...
}
此解决方案意味着myVar
和myOtherVar
都可以转换为dbType
隐含的公共类型,并且您的计划感兴趣的所有DbType
都会被涵盖在您的DbTypeToType
表中。
答案 1 :(得分:0)
我建议使用作为Enum的DbType
if (dbType.GetType().ToString() == Enum.GetName(typeof(DbType), DbType.String))
if (Convert.ToString(myVar) == Convert.ToString(myOtherVar))
doSomethingUseful();
else if (dbType.GetType().ToString() == Enum.GetName(typeof(DbType), DbType.Int32))
if (Convert.ToInt32(myVar) == Convert.ToInt32(myOtherVar))
doSomethingUseful();