大家都知道,在泛型中,使用default关键字能够获取类/结构的默认值.如:
        public class MyClass<T>
        {
            public static T GetDefaultValue()
            {
                return default(T);
            }
        }
 
而 default 来说,它并不是CLR的关键字,所以对应的IL 为
 .maxstack 1
    .locals init (
        [0] !T CS$1$0000,
        [1] !T CS$0$0001)
    L_0000: nop 
    L_0001: ldloca.s CS$0$0001
    L_0003: initobj !T
    L_0009: ldloc.1 
    L_000a: stloc.0 
    L_000b: br.s L_000d
    L_000d: ldloc.0 
    L_000e: ret 
  但是,当我使用Emit的时候,发现系统暴出"操作可能会破坏运行时稳定性。"
  
 晕,应该是类型安全问题. 可是怎么解决呢?没有头绪,希望大家给个思路. delegate object GetValueDelegate(Type t);    DynamicMethod GetValueMethod = new DynamicMethod("GetValue", typeof(object), new Type[] { typeof(Type) },true);            ILGenerator il = GetValueMethod.GetILGenerator();
            Label notNullLabel = il.DefineLabel();
            Label nullDoneLabel = il.DefineLabel();
            LocalBuilder oldNew = il.DeclareLocal(propertyType);
            LocalBuilder localNew = il.DeclareLocal(propertyType);            il.Emit(OpCodes.Ldloca_S, localNew);
            il.Emit(OpCodes.Initobj, propertyType);
            il.Emit(OpCodes.Ldloc_1);
            il.Emit(OpCodes.Stloc_0);
            il.Emit(OpCodes.Br_S, notNullLabel);
            il.MarkLabel(notNullLabel);
            il.Emit(OpCodes.Ldloc_0);
 
            OpCode specificOpCode;
            if (typeToOpcode.TryGetValue(propertyType, out specificOpCode))
            {
                il.Emit(specificOpCode);
            }
            else
            {
                il.Emit(OpCodes.Ldobj, propertyType);
            }
            il.MarkLabel(nullDoneLabel);             il.Emit(OpCodes.Ret);            GetValueDelegate GetValue = (GetValueDelegate)GetValueMethod.CreateDelegate(typeof(GetValueDelegate));            //执行动态方法 
            GetValue(propertyType);