您的位置:首页 > 编程语言

使用.net 中的动态方法编程备忘录4(DynamicMethod 类的构造函数及访问其他类的私有成员)

2010-07-08 01:03 441 查看
使用 这种编程方式,一个重要原因就是类的封装性。

通过不同的访问修饰符(如private、public、protected等),可限定类成员具有不同的访问级别。

一般来说:

private 修饰符修饰的成员,只能由该类内部访问;

protected 修饰的成员,除了允许当前类访问外,还可运行继承类访问;

internal 修饰的成员,可允许同一个程序集内部访问;

public 修饰的成员,不但允许同一程序集内部访问,还可运行其他程序集访问(当然,类也必须是 public 的)。

在创建动态方法(DynamicMethod)时,通过选择合适的构造函数和参数,是可以访问其他类的私有成员的,这无疑为采用发出动态方法的编程方式提供了更灵活的选择。

DynamicMethod 类的构造函数有:

名称说明
DynamicMethod(String, Type, Type[]) 初始化匿名承载的动态方法,指定方法名称、返回类型和参数类型。
DynamicMethod(String, Type, Type[], Boolean) 初始化匿名承载的动态方法,指定方法名称、返回类型、参数类型,并指定动态方法的 Microsoft 中间语言 (MSIL) 访问的类型和成员是否应跳过实时 (JIT) 可见性检查。
DynamicMethod(String, Type, Type[], Module) 创建一个对模块全局有效的动态方法,指定方法名称、返回类型、参数类型和模块。
DynamicMethod(String, Type, Type[], Type) 创建一个动态方法,指定方法名称、返回类型、参数类型和动态方法逻辑关联的类型。
DynamicMethod(String, Type, Type[], Module, Boolean) 创建一个对模块全局有效的动态方法,指定方法名称、返回类型、参数类型和模块,并指定动态方法的 Microsoft 中间语言 (MSIL) 访问的类型和成员是否应跳过实时 (JIT) 可见性检查。
DynamicMethod(String, Type, Type[], Type, Boolean) 创建一个动态方法,指定方法名称、返回类型、参数类型、动态方法逻辑关联的类型,并指定动态方法的 Microsoft 中间语言 (MSIL) 访问的类型和成员是否应跳过实时 (JIT) 可见性检查。
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean) 创建一个对模块全局有效的动态方法,指定方法名称、属性、调用约定、返回类型、参数类型和模块,并指定动态方法的 Microsoft 中间语言 (MSIL) 访问的类型和成员是否应跳过实时 (JIT) 可见性检查。
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean) 创建一个动态方法,指定方法名称、属性、调用约定、返回类型、参数类型、动态方法逻辑关联的类型,并指定动态方法的 Microsoft 中间语言 (MSIL) 访问的类型和成员是否应跳过实时 (JIT) 可见性检查。
我使用过上述构造函数中的第3、4、5、6个。

其中,有的构造函数的参数列表中,最后一个参数为 bool 类型的 restrictedSkipVisibility,msdn解释为:

restrictedSkipVisibility 类型:System.Boolean

若要跳过对动态方法的 MSIL 访问的类型和方法的 JIT 可见性检查,则为 true,前提是:包含这些类型和成员的程序集的信任级别必须等于或低于发出动态方法的调用堆栈的信任级别;否则为 false。

但此解释比较难以看明白。

在实际应用时,一次发现运行时报错,好像提示说是访问受限的成员。

那个方法中,确实从此类访问另一个类的私有字段,而构造函数我采用的是第四个构造函数(DynamicMethod(String, Type, Type[], Type) ),后来改用第六个(DynamicMethod(String, Type, Type[], Type, Boolean) )构造函数,并发现将最后一个bool类型参数设置为 true 时,程序正确编译并能正确运行。

我没有测试在一个程序集是否访问另一个程序集中类的私有成员。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐