如何将不可空类型转换为可空类型?

发布于 2024-12-10 17:35:58 字数 413 浏览 0 评论 0原文

是否可以将仅在运行时已知的不可空值类型转换为可空值类型?换句话说:

public Type GetNullableType(Type t)
{
    if (t.IsValueType)
    {
        return typeof(Nullable<t>);
    }
    else
    {
        throw new ArgumentException();
    }
}

显然 return 行给出了错误。有办法做到这一点吗? Type.MakeGenericType 方法看起来很有前途,但我不知道如何获取表示 Nullable 的未指定通用 Type 对象。有什么想法吗?

Is it possible to convert a non-nullable value type known only at runtime to nullable? In other words:

public Type GetNullableType(Type t)
{
    if (t.IsValueType)
    {
        return typeof(Nullable<t>);
    }
    else
    {
        throw new ArgumentException();
    }
}

Obviously the return line gives an error. Is there a way to do this? The Type.MakeGenericType method seems promising, but I have no idea how to get a unspecified generic Type object representing Nullable<T>. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(4

疯了 2024-12-17 17:35:58

您想要 typeof(Nullable<>).MakeGenericType(t)

注意:Nullable<> 不带任何提供的参数是未绑定的泛型类型;对于更复杂的示例,您可以添加逗号以适应 - 即 KeyValuePair<,>, Tuple<,,,> 等。

you want typeof(Nullable<>).MakeGenericType(t)

Note: Nullable<> without any supplied arguments is the unbound generic type; for more complex examples, you would add commas to suit - i.e. KeyValuePair<,>, Tuple<,,,> etc.

最佳男配角 2024-12-17 17:35:58

你走在正确的轨道上。试试这个:

if (t.IsValueType)
{
    return typeof(Nullable<>).MakeGenericType(t);
}
else
{
    throw new ArgumentException();
}

You're on the right track. Try this:

if (t.IsValueType)
{
    return typeof(Nullable<>).MakeGenericType(t);
}
else
{
    throw new ArgumentException();
}
时光沙漏 2024-12-17 17:35:58
Type GetNullableType(Type type) {
    // Use Nullable.GetUnderlyingType() to remove the Nullable<T> wrapper
    // if type is already nullable.
    type = Nullable.GetUnderlyingType(type);
    if (type.IsValueType)
        return typeof(Nullable<>).MakeGenericType(type);
    else
        return type;
} 
Type GetNullableType(Type type) {
    // Use Nullable.GetUnderlyingType() to remove the Nullable<T> wrapper
    // if type is already nullable.
    type = Nullable.GetUnderlyingType(type);
    if (type.IsValueType)
        return typeof(Nullable<>).MakeGenericType(type);
    else
        return type;
} 
夏日浅笑〃 2024-12-17 17:35:58

最简单的解决方案是返回第一个 GenericTypeArguments 的 UnderlyingSystemType。那么在这个例子中,是一个可为空的日期时间吗?作为属性类型返回,我需要将其转换为日期时间类型,以便可以将其添加到数据表中。这应该与 int 一起使用吗?和双? ETC。

if (Nullable.GetUnderlyingType(prop.PropertyType) != null) {
  tb.Columns.Add(prop.Name, prop.PropertyType.GenericTypeArguments.First().UnderlyingSystemType);
} else {
  tb.Columns.Add(prop.Name, prop.PropertyType);
}

The easiest solution is to return the UnderlyingSystemType of the first of the GenericTypeArguments. So in this example, a Nullable Datetime? is returning as the property type and I need to convert it to a Datetime type so it can be added to a DataTable. This should work with int? and double? etc.

if (Nullable.GetUnderlyingType(prop.PropertyType) != null) {
  tb.Columns.Add(prop.Name, prop.PropertyType.GenericTypeArguments.First().UnderlyingSystemType);
} else {
  tb.Columns.Add(prop.Name, prop.PropertyType);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文