以下で私がしようとしている重要なポイントは、実際にはそうではないが、アンボックスが機能するのに十分に似ている場合は可能かもしれないということです. それを理解するという点で、私がここで主に注目するのは、 とは何かということです。obj
int
int
obj.GetType()
OK、邪悪なコード: - 最初に重要なビット:
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);
}