C# 给定一个类型,如何确定它被装箱为什么类型?

C# 给定一个类型,如何确定它被装箱为什么类型?,c#,.net,c#-4.0,types,.net-4.0,C#,.net,C# 4.0,Types,.net 4.0,根据: 当可空类型被装箱时,公共语言运行库会自动装箱可空对象的基础值,而不是可空对象本身 代码: public Type GetBoxedType(Type type) { Type result; if (Nullable.GetUnderlyingType(type) != null) { result = Nullable.GetUnderlyingType(type); } else { throw new

根据:

当可空类型被装箱时,公共语言运行库会自动装箱可空对象的基础值,而不是可空对象本身

代码:

public Type GetBoxedType(Type type)
{
    Type result;

    if (Nullable.GetUnderlyingType(type) != null)
    {
        result = Nullable.GetUnderlyingType(type);
    }
    else
    {
        throw new NotImplementedException();
    }

    return result;
}

如何将此方法推广到所有封闭类型?

如果我正确理解您的要求,这就是您想要的:

Type GetBoxedType(Type type)
{
    var underlyingType = Nullable.GetUnderlyingType(type);
    return underlyingType ?? type;
}
对于引用类型,它返回相同的类型(即对于
List
,它将返回
List
,因为引用类型未装箱)。
对于非
Nullable
的值类型,它也将返回相同的类型(例如
int
int
),因为这就是它们的装箱方式。

对于
Nullable
,它将返回
T
,就像您已经实现的那样。

您看过泛型方法吗?我不确定“对于所有封闭类型”是什么意思……我的意思是,引用类型没有装箱,因此该方法可能应该是原始类型(或抛出?)。值类型(除了
Nullable
)将作为同一类型装箱…对于
Nullable
,您已经有了一个实现。你能举一个你想要实现的例子吗?@Jawad-你能说更多吗?@RenéVogt-封闭类型的限定仅仅意味着这个方法永远不会用开放类型调用(例如GetBoxedType(typeof(IList)))。我正在尝试实现一个方法,该方法返回任何封闭类型的正确答案=)您的响应意味着只有3种情况:值类型(不包括可为null的)、可为null的类型和引用类型。这包括所有可能的情况吗?我知道什么是封闭类型,但这个问题对我来说仍然没有意义。请给出一个示例,说明要传递给该方法的类型以及预期的结果。是否可以创建一个类来指定如何装箱?如果是这样的话,那么这个解决方案在这种情况下就不会做正确的事情(如果你不是被迫在某个地方声明,那么可能没有通用的解决方案)。另外,您的意思是,对于内置的.NET类型,只有这三种情况?@SFun28 A
class
将永远不会被装箱。因此,您无法指定如何装箱。装箱意味着将值类型实例从堆栈/寄存器放入堆中。我不会说有三种情况。类根本不装箱,值类型都以相同的方式装箱。只有一种特殊情况:
Nullable
,在这种情况下,只有
T
被装箱,而不是整个
Nullable
。是的,很抱歉,我想说的是一个自定义结构。但你似乎更想在这里强制转换/转换,而不是装箱。也许,如果你在你的问题中加入一些背景知识,关于你真正想要达到的目标,我们可以给出一个更有用的答案。看起来像一个。是的,除了学习CLR如何装箱外,没有其他方法来指定如何装箱(在语言或IL中)。也就是说,您可以按照希望的方式在内存中布局结构,但这与装箱完全不同。这对我来说已经足够了。