将 SqlDataType 转换为 C# 枚举
这是自动执行 1-1 Table.Column-Class.Property 匹配过程的一部分。我试图涵盖每种可能的基本类型的基础,如此处列出。我越来越多地使用 ORM,但现在我又回到了他们正在执行 Id = row["Id"] as int
的环境,而不是采用那种暴力方式我只是在属性上使用了属性,这样我就可以编写 DataTable.ExtractAs
来尝试基于这些属性创建和 IList
。
我的问题是:是否有更好的方法来处理从 SqlDataType 到涵盖所有整数类型的 C# 枚举的转换?
现在我正在这样做:
internal static bool TrySetValue<T>(T t, PropertyInfo property, DataRow row, string columnName)
{
Type propertyType = property.PropertyType;
// other logic and unique cases
if (propertyType.IsEnum
&& Enum.GetUnderlyingType(propertyType) == value.GetType())
{
property.SetValue(t, value, null);
return true;
}
}
这太过分了吗?有更好的方法吗?我在 PropertyInfo
中没有看到任何解决这些整数类型的成员。
This is part of a process to do 1-1 Table.Column-Class.Property matching automatically. I'm trying to cover the bases for each possible base type as listed here. I've been working with ORM's more and more but now I've gone back to an environment where they're doing Id = row["Id"] as int
but instead of doing that brute force way of casting I just used attributes on the Properties so that I could write DataTable.ExtractAs<MyClass>
which attempts to create and IList<MyClass>
based on those attributes.
My questions is: Is there a better way to handle casting from a SqlDataType to a C# enum that covers all integral types?
Right now I'm doing this:
internal static bool TrySetValue<T>(T t, PropertyInfo property, DataRow row, string columnName)
{
Type propertyType = property.PropertyType;
// other logic and unique cases
if (propertyType.IsEnum
&& Enum.GetUnderlyingType(propertyType) == value.GetType())
{
property.SetValue(t, value, null);
return true;
}
}
Is this overkill? Is there a better way to do this? I don't see any member within PropertyInfo
that addresses these integral types.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用
Enum.ToObject(object)
来处理SByte
、Byte
、Int16
、的转换>UInt16
、Int32
、UInt32
、Int64
和UInt64
到枚举:You can use
Enum.ToObject(object)
which will handle conversion fromSByte
,Byte
,Int16
,UInt16
,Int32
,UInt32
,Int64
andUInt64
to an enum: