Como testar se um valor está na caixa em C # / .NET?

Estou procurando uma maneira de escrever código que teste se um valor está na caix

Minhas investigações preliminares indicam que o .NET se esforça para esconder o fato, o que significa queGetType() eIsValueType não revela a diferença entre um valor em caixa e um valor em caixa. Por exemplo, nas seguintes expressões LinqPad C #, acredito queo1 está na caixa ei1 não está na caixa, mas eu gostaria de testá-lo em código ou, em segundo lugar, uma maneira de saberCOM CERTEZ ao examinar qualquer variável ou valor, mesmo que seu tipo seja "dinâmico" ou "objeto", com ou sem caix

Algum conselho?

// boxed? -- no way to tell from these answers!
object o1 = 123;
o1.GetType().Dump("o1.GetType()");
o1.GetType().IsValueType.Dump("o1.GetType().IsValueType");

// not boxed? -- no way to tell from these answers!
int i1 = 123;
i1.GetType().Dump("i1.GetType()");
i1.GetType().IsValueType.Dump("i1.GetType().IsValueType");