Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Reflection/Dynamic
In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv3433/src/Spring/Spring.Core/Reflection/Dynamic
Modified Files:
DynamicField.cs DynamicReflectionManager.cs
Log Message:
fixed some 2003 solution missing files
added SafeField tests
DynamicField.Create returns SafeField in net-2.0 now
added StopWatch to Spring.Core.Tests for performance tests
Index: DynamicReflectionManager.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Reflection/Dynamic/DynamicReflectionManager.cs,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DynamicReflectionManager.cs 13 May 2008 23:23:03 -0000 1.3
--- DynamicReflectionManager.cs 16 May 2008 10:02:39 -0000 1.4
***************
*** 310,314 ****
ILGenerator il = dmSetter.GetILGenerator();
! if (!fieldInfo.IsLiteral)
{
if (!fieldInfo.IsStatic)
--- 310,316 ----
ILGenerator il = dmSetter.GetILGenerator();
! if (!fieldInfo.IsLiteral
! && !fieldInfo.IsInitOnly
! && !(fieldInfo.DeclaringType.IsValueType && !fieldInfo.IsStatic))
{
if (!fieldInfo.IsStatic)
Index: DynamicField.cs
===================================================================
RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Reflection/Dynamic/DynamicField.cs,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** DynamicField.cs 13 May 2008 23:23:03 -0000 1.3
--- DynamicField.cs 16 May 2008 10:02:39 -0000 1.4
***************
*** 77,81 ****
private readonly FieldInfo fieldInfo;
#if NET_2_0
-
#region Cache
--- 77,80 ----
***************
*** 169,192 ****
/// <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;
private bool isOptimizedSet = false;
/// <summary>
--- 168,194 ----
/// <returns>an <see cref="IDynamicField"/> instance for accessing the
/// field represented by the given <see cref="FieldInfo"/></returns>
! public static IDynamicField CreateFrom(FieldInfo field)
! {
! AssertUtils.ArgumentNotNull(field, "You cannot create a dynamic field for a null value.");
! IDynamicField dynamicField;
! if (field.IsPublic &&
! ReflectionUtils.IsTypeVisible(field.DeclaringType, DynamicReflectionManager.ASSEMBLY_NAME))
! {
! dynamicField = DynamicField.Create(field);
! }
! else
! {
! dynamicField = new SafeField(field);
! }
! return dynamicField;
! }
!
! private readonly IDynamicField dynamicField;
! private readonly bool isOptimizedGet = false;
private bool isOptimizedSet = false;
+ private readonly bool canSet;
/// <summary>
***************
*** 196,202 ****
public SafeField(FieldInfo field)
{
this.fieldInfo = field;
! if (fieldInfo.IsPublic &&
ReflectionUtils.IsTypeVisible(fieldInfo.DeclaringType, DynamicReflectionManager.ASSEMBLY_NAME))
{
--- 198,209 ----
public SafeField(FieldInfo field)
{
+ AssertUtils.ArgumentNotNull(field, "You cannot create a dynamic field for a null value.");
+
this.fieldInfo = field;
+ this.canSet = (!fieldInfo.IsLiteral
+ && !fieldInfo.IsInitOnly
+ && !(fieldInfo.DeclaringType.IsValueType && !fieldInfo.IsStatic));
! if (fieldInfo.IsPublic &&
ReflectionUtils.IsTypeVisible(fieldInfo.DeclaringType, DynamicReflectionManager.ASSEMBLY_NAME))
{
***************
*** 247,250 ****
--- 254,262 ----
{
isOptimizedSet = false;
+ if (!canSet)
+ {
+ throw new InvalidOperationException("Cannot set value of a read-only field or a constant.");
+ }
+
fieldInfo.SetValue(target, value);
}
***************
*** 252,255 ****
--- 264,271 ----
else
{
+ if (!canSet)
+ {
+ throw new InvalidOperationException("Cannot set value of a read-only field or a constant.");
+ }
fieldInfo.SetValue(target, value);
}
***************
*** 264,267 ****
--- 280,305 ----
#endregion
+ #if NET_2_0
+ /// <summary>
+ /// Factory class for dynamic fields.
+ /// </summary>
+ /// <author>Aleksandar Seovic</author>
+ /// <version>$Id$</version>
+ public class DynamicField : BaseDynamicMember
+ {
+ /// <summary>
+ /// Creates dynamic field instance for the specified <see cref="FieldInfo"/>.
+ /// </summary>
+ /// <param name="field">Field info to create dynamic field for.</param>
+ /// <returns>Dynamic field for the specified <see cref="FieldInfo"/>.</returns>
+ public static IDynamicField Create(FieldInfo field)
+ {
+ AssertUtils.ArgumentNotNull(field, "You cannot create a dynamic field for a null value.");
+
+ IDynamicField dynamicField = new SafeField(field);
+ return dynamicField;
+ }
+ }
+ #else
/// <summary>
/// Factory class for dynamic fields.
***************
*** 412,416 ****
{
bool isValueType = field.DeclaringType.IsValueType;
! if (isValueType)
{
ThrowInvalidOperationException(il, "Cannot set field value on a value type due to boxing.");
--- 450,454 ----
{
bool isValueType = field.DeclaringType.IsValueType;
! if (isValueType && !field.IsStatic)
{
ThrowInvalidOperationException(il, "Cannot set field value on a value type due to boxing.");
***************
*** 445,448 ****
--- 483,487 ----
#endregion
}
+ #endif // NET_2_0
}
|