大家都知道,在泛型中,使用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);
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);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货