我在下面要说明的关键点是,是的,如果实际obj
不是真正的int
但足够int
像 unbox 工作的东西,那么它可能是可能的。就理解它而言,我在这里要看的主要内容是:什么是obj.GetType()
.
好的,邪恶的代码: - 首先是重要的一点:
static void Main()
{
object obj = Evil();
int i = (int)obj; // 0
int j = int.Parse(obj.ToString()); // 42
}
我是怎么做到这个怪物的?
我撒谎和欺骗......基本上,我是这样做的:
enum bar {
@42 = 0 // not legal C#... "42" is not a valid identifier
}
但在 CLI 级别它是有效的......
static object Evil()
{
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("foo"), AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule("foo");
var eb = mb.DefineEnum("bar", TypeAttributes.Public, typeof(int));
eb.DefineLiteral("42", 0);
Type t = eb.CreateType();
return Enum.ToObject(t, 0);
}