首页 新闻 会员 周边

用Emit实现为指定类型创建默认值,出现 "操作可能会破坏运行时稳定"

0
悬赏园豆:100 [已关闭问题]

大家都知道,在泛型中,使用default关键字能够获取类/结构的默认值.

如:

C# code

public class MyClass<T>
{
public static T GetDefaultValue()
{
return default(T);
}
}


而 default 来说,它并不是CLR的关键字,所以对应的IL 为

C# code

.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的时候,发现系统暴出"操作可能会破坏运行时稳定性。"
 
晕,应该是类型安全问题.

可是怎么解决呢?没有头绪,希望大家给个思路.

C# code

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);


MistSeen的主页 MistSeen | 初学一级 | 园豆:100
提问于:2009-10-12 17:49
< >
分享
其他回答(2)
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);

苏飞 | 园豆:2024 (老鸟四级) | 2009-10-12 22:30
這個是啥意思呢 ?
支持(0) 反对(0) MistSeen | 园豆:100 (初学一级) | 2009-10-13 15:53
0

请问你是怎么解决的呢?

dongger | 园豆:9 (初学一级) | 2015-08-14 17:17
0

貌似修改一下 ,就可以了 

DynamicMethod GetValueMethod = new DynamicMethod("GetValue", typeof(object), new Type[] { typeof(Type) },true);

 

http://www.maomao365.com/?p=4029 

Adeal2008 | 园豆:204 (菜鸟二级) | 2017-02-03 15:51

    https://msdn.microsoft.com/zh-cn/library/system.reflection.emit.dynamicmethod.dynamicmethod(v=vs.85).aspx

支持(0) 反对(0) Adeal2008 | 园豆:204 (菜鸟二级) | 2017-02-03 15:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册