使用.net 中的动态方法编程备忘录4(DynamicMethod 类的构造函数及访问其他类的私有成员)
2010-07-08 01:03
441 查看
使用 类 这种编程方式,一个重要原因就是类的封装性。
通过不同的访问修饰符(如private、public、protected等),可限定类成员具有不同的访问级别。
一般来说:
private 修饰符修饰的成员,只能由该类内部访问;
protected 修饰的成员,除了允许当前类访问外,还可运行继承类访问;
internal 修饰的成员,可允许同一个程序集内部访问;
public 修饰的成员,不但允许同一程序集内部访问,还可运行其他程序集访问(当然,类也必须是 public 的)。
在创建动态方法(DynamicMethod)时,通过选择合适的构造函数和参数,是可以访问其他类的私有成员的,这无疑为采用发出动态方法的编程方式提供了更灵活的选择。
DynamicMethod 类的构造函数有:
我使用过上述构造函数中的第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 时,程序正确编译并能正确运行。
我没有测试在一个程序集是否访问另一个程序集中类的私有成员。
通过不同的访问修饰符(如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) 可见性检查。 |
其中,有的构造函数的参数列表中,最后一个参数为 bool 类型的 restrictedSkipVisibility,msdn解释为:
restrictedSkipVisibility 类型:System.Boolean
若要跳过对动态方法的 MSIL 访问的类型和方法的 JIT 可见性检查,则为 true,前提是:包含这些类型和成员的程序集的信任级别必须等于或低于发出动态方法的调用堆栈的信任级别;否则为 false。
但此解释比较难以看明白。
在实际应用时,一次发现运行时报错,好像提示说是访问受限的成员。
那个方法中,确实从此类访问另一个类的私有字段,而构造函数我采用的是第四个构造函数(DynamicMethod(String, Type, Type[], Type) ),后来改用第六个(DynamicMethod(String, Type, Type[], Type, Boolean) )构造函数,并发现将最后一个bool类型参数设置为 true 时,程序正确编译并能正确运行。
我没有测试在一个程序集是否访问另一个程序集中类的私有成员。
相关文章推荐
- 使用.net 中的动态方法编程备忘录3(DynamicMethod 的最优访问方式)
- 在动态方法中如何尽量减少定义的 LocalBuilder 数量 (使用.net 中的动态方法编程备忘录8)
- OpCodes.Call 与 OpCodes.Callvirt (使用.net 中的动态方法编程备忘录7)
- 在动态方法中的比较运算 (使用.net 中的动态方法编程备忘录9)
- 使用.net 中的动态方法编程备忘录1(如何查看生成的动态方法的代码)
- 使用.net 中的动态方法编程备忘录5(在动态方法中使用条件语句)
- 使用.net 中的动态方法编程备忘录6(OpCodes.Ldloc 与OpCodes.Ldloca)
- 使用.net 中的动态方法编程备忘录2(使用发出动态方法的意义)
- 使用Java反射机制实现访问其他类的私有方法
- 解决“使用google test做单元测试(unit test)中访问类的私有成员”的几种方法
- 使用Java反射机制实现访问其他类的私有方法
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- 使用Java反射机制实现访问其他类的私有方法
- 私有成员、SET方法、构造函数、访问权限、委托与事件
- 使用java基础反射访问私有域、方法和构造函数
- 为什么一个对象调用的类方法可以访问该类其他对象的私有成员
- 使用Java反射机制实现访问其他类的私有方法
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- datasnap——动态注册服务类 datasnap——动态注册服务类 在DataSnap的应用程序时,我们首先需要注册的服务器类,以提供访问客户端应用程序的服务器方法。通常的做法是使用DSSer
- 为什么子类不能访问基类的private成员(为什么要使用get,set方法)?为什么要这样设计?