Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Reflection/Dynamic
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv17466/src/Spring/Spring.Core/Reflection/Dynamic
Modified Files:
DynamicField.cs
Log Message:
SPRNET-794 - complete rework of Control interception
minor fixes to SpringAir demo
switched DynamicField implementation to using net-2.0's DynamicMethod technique
Index: DynamicField.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Reflection/Dynamic/DynamicField.cs,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** DynamicField.cs 8 Aug 2007 04:05:37 -0000 1.1
--- DynamicField.cs 13 May 2008 14:22:46 -0000 1.2
***************
*** 22,25 ****
--- 22,26 ----
using System;
+ using System.Collections;
using System.Reflection;
using System.Reflection.Emit;
***************
*** 74,78 ****
public class SafeField : IDynamicField
{
! private FieldInfo fieldInfo;
private IDynamicField dynamicField;
private bool isOptimizedGet = false;
--- 75,307 ----
public class SafeField : IDynamicField
{
! private readonly FieldInfo fieldInfo;
! #if NET_2_0
! private readonly IDynamicField dynamicField;
! private static readonly Type[] s_ctorArgTypes = new Type[] { typeof(FieldInfo)};
! private static readonly Hashtable s_ctorCache = new Hashtable(100);
!
! /// <summary>
! /// Returns a <see cref="IDynamicField"/> implementation
! /// by determining the fastest possible dynamic access strategy
! /// </summary>
! /// <param name="field">the field to be wrapped</param>
! /// <returns>an <see cref="IDynamicField"/> instance for accessing the
! /// field represented by the given <see cref="FieldInfo"/></returns>
! public static IDynamicField CreateFrom(FieldInfo field)
! {
! IDynamicField dynamicField;
!
! if (field.IsLiteral)
! {
! dynamicField = new LiteralField(field);
! }
! else if (field.IsStatic)
! {
! ConstructorInfo ctor = typeof (StaticField<>).MakeGenericType(field.FieldType).GetConstructor(s_ctorArgTypes);
! dynamicField =
! (IDynamicField)ctor.Invoke(new object[] {field});
! // (IDynamicField)Activator.CreateInstance(typeof(StaticField<>).MakeGenericType(field.FieldType), field);
! }
! else
! {
! ConstructorInfo ctor = typeof (InstanceField<,>).MakeGenericType(field.FieldType, field.DeclaringType).GetConstructor(s_ctorArgTypes);
! dynamicField =
! (IDynamicField)ctor.Invoke(new object[] {field});
! // (IDynamicField) Activator.CreateInstance(typeof(InstanceField<,>).MakeGenericType(field.FieldType, field.DeclaringType), field);
! }
!
! return dynamicField;
! }
!
! /// <summary>
! /// Creates a new instance of the safe field wrapper.
! /// </summary>
! /// <param name="field">Field to wrap.</param>
! public SafeField(FieldInfo field)
! {
! fieldInfo = field;
! dynamicField = CreateFrom(field);
! }
!
! /// <summary>
! /// Gets the value of the dynamic field for the specified target object.
! /// </summary>
! /// <param name="target">
! /// Target object to get field value from.
! /// </param>
! /// <returns>
! /// A field value.
! /// </returns>
! public object GetValue(object target)
! {
! return dynamicField.GetValue(target);
! }
!
! /// <summary>
! /// Gets the value of the dynamic field for the specified target object.
! /// </summary>
! /// <param name="target">
! /// Target object to set field value on.
! /// </param>
! /// <param name="value">
! /// A new field value.
! /// </param>
! public void SetValue(object target, object value)
! {
! dynamicField.SetValue(target, value);
! }
!
! #region Field Accessor Specializations
!
! /// <summary>
! /// wraps a constant field
! /// </summary>
! private class LiteralField : IDynamicField
! {
! private readonly object _value;
!
! public LiteralField(FieldInfo field)
! {
! _value = field.GetValue(null);
! }
!
! public object GetValue(object target)
! {
! return _value;
! }
!
! public void SetValue(object target, object value)
! {
! throw new NotSupportedException("value is readonly");
! }
! }
!
! /// <summary>
! /// wraps a static field
! /// </summary>
! private class StaticField<T> : IDynamicField
! {
! private delegate T Getter();
! private delegate void Setter(T value);
!
! private readonly FieldInfo field;
! private readonly Getter getter;
! private readonly Setter setter;
!
! public StaticField(FieldInfo field)
! {
! this.field = field;
! getter = CreateGetter(field);
! setter = CreateSetter(field);
! }
!
! public object GetValue(object target)
! {
! return getter();
! }
!
! public void SetValue(object target, object value)
! {
! setter((T)value);
! }
!
! private static Getter CreateGetter(FieldInfo fieldInfo)
! {
! ILGenerator ilGen;
! System.Reflection.Emit.DynamicMethod dmGetter = new System.Reflection.Emit.DynamicMethod("getter", fieldInfo.FieldType, null, fieldInfo.DeclaringType.Module, true);
! ilGen = dmGetter.GetILGenerator();
! ilGen.Emit(OpCodes.Ldsfld, fieldInfo);
! ilGen.Emit(OpCodes.Ret);
! return (Getter)dmGetter.CreateDelegate(typeof(Getter));
! }
!
! private static Setter CreateSetter(FieldInfo fieldInfo)
! {
! ILGenerator ilGen;
! System.Reflection.Emit.DynamicMethod dmSetter = new System.Reflection.Emit.DynamicMethod("setter", null, new Type[] { fieldInfo.FieldType }, fieldInfo.DeclaringType.Module, true);
! ilGen = dmSetter.GetILGenerator();
! ilGen.Emit(OpCodes.Ldarg_0);
! ilGen.Emit(OpCodes.Stsfld, fieldInfo);
! ilGen.Emit(OpCodes.Ret);
! return (Setter)dmSetter.CreateDelegate(typeof(Setter));
! }
! }
!
! private class InstanceField<T, O> : IDynamicField
! {
! private delegate T Getter(O target);
! private delegate void Setter(O target, T value);
!
! private readonly FieldInfo field;
! private readonly Getter getter;
! private readonly Setter setter;
!
! public InstanceField(FieldInfo field)
! {
! this.field = field;
! getter = GetGetter(field);
! setter = GetSetter(field);
! }
!
! public object GetValue(object target)
! {
! return getter((O)target);
! }
!
! public void SetValue(object target, object value)
! {
! setter((O)target, (T)value);
! }
!
! private static Getter GetGetter(FieldInfo fieldInfo)
! {
! ILGenerator ilGen;
! System.Reflection.Emit.DynamicMethod dmGetter = new System.Reflection.Emit.DynamicMethod("getter", fieldInfo.FieldType, new Type[] { fieldInfo.DeclaringType }, fieldInfo.DeclaringType.Module, true);
! ilGen = dmGetter.GetILGenerator();
! ilGen.Emit(OpCodes.Ldarg_0);
! ilGen.Emit(OpCodes.Ldfld, fieldInfo);
! ilGen.Emit(OpCodes.Ret);
! return (Getter)dmGetter.CreateDelegate(typeof(Getter));
! }
!
! private static Setter GetSetter(FieldInfo fieldInfo)
! {
! System.Reflection.Emit.DynamicMethod dmSetter = new System.Reflection.Emit.DynamicMethod("setter", null, new Type[] { fieldInfo.DeclaringType, fieldInfo.FieldType }, fieldInfo.DeclaringType.Module, true);
! ILGenerator ilGen = dmSetter.GetILGenerator();
! ilGen.Emit(OpCodes.Ldarg_0);
! ilGen.Emit(OpCodes.Ldarg_1);
! ilGen.Emit(OpCodes.Stfld, fieldInfo);
! ilGen.Emit(OpCodes.Ret);
! return (Setter)dmSetter.CreateDelegate(typeof(Setter));
! }
! }
!
! #endregion
!
! #else
! /// <summary>
! /// Returns a <see cref="IDynamicField"/> implementation
! /// by determining the fastest possible dynamic access strategy
! /// </summary>
! /// <param name="field">the field to be wrapped</param>
! /// <returns>an <see cref="IDynamicField"/> instance for accessing the
! /// field represented by the given <see cref="FieldInfo"/></returns>
! public static IDynamicField CreateFrom(FieldInfo field)
! {
! IDynamicField dynamicField;
!
! if (field.IsPublic &&
! ReflectionUtils.IsTypeVisible(field.DeclaringType, DynamicReflectionManager.ASSEMBLY_NAME))
! {
! dynamicField = DynamicField.Create(field);
! }
! else
! {
! dynamicField = new SafeField(field);
! }
!
! return dynamicField;
! }
!
private IDynamicField dynamicField;
private bool isOptimizedGet = false;
***************
*** 144,148 ****
}
}
!
internal FieldInfo FieldInfo
{
--- 373,377 ----
}
}
! #endif
internal FieldInfo FieldInfo
{
***************
*** 152,156 ****
#endregion
!
/// <summary>
/// Factory class for dynamic fields.
--- 381,385 ----
#endregion
!
/// <summary>
/// Factory class for dynamic fields.
***************
*** 189,193 ****
Type dynamicFieldType = tb.CreateType();
ConstructorInfo ctor = dynamicFieldType.GetConstructor(Type.EmptyTypes);
! dynamicField = (IDynamicField) ctor.Invoke(ObjectUtils.EmptyObjects);
return dynamicField;
--- 418,422 ----
Type dynamicFieldType = tb.CreateType();
ConstructorInfo ctor = dynamicFieldType.GetConstructor(Type.EmptyTypes);
! dynamicField = (IDynamicField)ctor.Invoke(ObjectUtils.EmptyObjects);
return dynamicField;
|