大家都知道,在泛型中,使用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);
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);
请问你是怎么解决的呢?
貌似修改一下 ,就可以了
DynamicMethod GetValueMethod = new DynamicMethod("GetValue", typeof(object), new Type[] { typeof(Type) },true);
https://msdn.microsoft.com/zh-cn/library/system.reflection.emit.dynamicmethod.dynamicmethod(v=vs.85).aspx