将 SqlDataType 转换为 C# 枚举

发布于 2024-10-04 05:01:27 字数 914 浏览 0 评论 0原文

这是自动执行 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七婞 2024-10-11 05:01:27

您可以使用 Enum.ToObject(object) 来处理 SByteByteInt16的转换>UInt16Int32UInt32Int64UInt64 到枚举:

if (propertyType.IsEnum) {
    property.SetValue(Enum.ToObject(value));
}

You can use Enum.ToObject(object) which will handle conversion from SByte, Byte, Int16, UInt16, Int32, UInt32, Int64 and UInt64 to an enum:

if (propertyType.IsEnum) {
    property.SetValue(Enum.ToObject(value));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文