Refactored uses of CreateDelegate for compatibility with CF2

pull/288/head
csharptest 12 years ago committed by rogerk
parent 1ab73c6a6c
commit fc353381e8
  1. 7
      src/ProtocolBuffers.Test/TestUtil.cs
  2. 65
      src/ProtocolBuffers/FieldAccess/ReflectionUtil.cs
  3. 5
      src/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs
  4. 7
      src/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs

@ -1823,6 +1823,13 @@ namespace Google.ProtocolBuffers
action(); action();
Assert.Fail("Exception was not thrown"); Assert.Fail("Exception was not thrown");
} }
// Not a general case, however, Compact Framework v2 does use Invoke
catch (System.Reflection.TargetInvocationException te)
{
if (te.InnerException.GetType() != typeof(ArgumentNullException))
throw;
}
// Normally expected exception
catch (ArgumentNullException) catch (ArgumentNullException)
{ {
// We expect this exception. // We expect this exception.

@ -70,8 +70,7 @@ namespace Google.ProtocolBuffers.FieldAccess
{ {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method() // Convert the reflection call into an open delegate, i.e. instead of calling x.Method()
// we'll call getter(x). // we'll call getter(x).
Func<TSource, TResult> getter = Func<TSource, TResult> getter = ReflectionUtil.CreateDelegateFunc<TSource, TResult>(method);
(Func<TSource, TResult>)FrameworkPortability.CreateDelegate(typeof(Func<TSource, TResult>), null, method);
// Implicit upcast to object (within the delegate) // Implicit upcast to object (within the delegate)
return delegate(TSource source) { return getter(source); }; return delegate(TSource source) { return getter(source); };
@ -92,8 +91,7 @@ namespace Google.ProtocolBuffers.FieldAccess
{ {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll // Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll
// call Method(x, y) // call Method(x, y)
Action<TSource, TParam> call = Action<TSource, TParam> call = ReflectionUtil.CreateDelegateAction<TSource, TParam>(method);
(Action<TSource, TParam>)FrameworkPortability.CreateDelegate(typeof(Action<TSource, TParam>), null, method);
return delegate(TSource source, object parameter) { call(source, (TParam) parameter); }; return delegate(TSource source, object parameter) { call(source, (TParam) parameter); };
} }
@ -115,9 +113,7 @@ namespace Google.ProtocolBuffers.FieldAccess
{ {
// Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll // Convert the reflection call into an open delegate, i.e. instead of calling x.Method(y) we'll
// call Method(x, y) // call Method(x, y)
Func<TSource, TParam, TReturn> call = (Func<TSource, TParam, TReturn>) Func<TSource, TParam, TReturn> call = ReflectionUtil.CreateDelegateFunc<TSource, TParam, TReturn>(method);
FrameworkPortability.CreateDelegate(typeof(Func<TSource, TParam, TReturn>), null,
method);
return delegate(TSource source, object parameter) { call(source, (TParam) parameter); }; return delegate(TSource source, object parameter) { call(source, (TParam) parameter); };
} }
@ -134,8 +130,61 @@ namespace Google.ProtocolBuffers.FieldAccess
public static Func<IBuilder> CreateStaticUpcastDelegateImpl<T>(MethodInfo method) public static Func<IBuilder> CreateStaticUpcastDelegateImpl<T>(MethodInfo method)
{ {
Func<T> call = (Func<T>)FrameworkPortability.CreateDelegate(typeof(Func<T>), null, method); Func<T> call = ReflectionUtil.CreateDelegateFunc<T>(method);
return delegate { return (IBuilder) call(); }; return delegate { return (IBuilder) call(); };
} }
internal static Func<TResult> CreateDelegateFunc<TResult>(MethodInfo method)
{
#if !NOCREATEDELEGATE
object tdelegate = Delegate.CreateDelegate(typeof(Func<TResult>), null, method, true);
return (Func<TResult>)tdelegate;
#else
return delegate() { return (TResult)method.Invoke(null, null); };
#endif
}
internal static Func<T, TResult> CreateDelegateFunc<T, TResult>(MethodInfo method)
{
#if !NOCREATEDELEGATE
object tdelegate = Delegate.CreateDelegate(typeof(Func<T, TResult>), null, method, true);
return (Func<T, TResult>)tdelegate;
#else
if (method.IsStatic)
{
return delegate(T arg1) { return (TResult) method.Invoke(null, new object[] {arg1}); };
}
return delegate(T arg1) { return (TResult)method.Invoke(arg1, null); };
#endif
}
internal static Func<T1, T2, TResult> CreateDelegateFunc<T1, T2, TResult>(MethodInfo method)
{
#if !NOCREATEDELEGATE
object tdelegate = Delegate.CreateDelegate(typeof(Func<T1, T2, TResult>), null, method, true);
return (Func<T1, T2, TResult>)tdelegate;
#else
if (method.IsStatic)
{
return delegate(T1 arg1, T2 arg2) { return (TResult) method.Invoke(null, new object[] {arg1, arg2}); };
}
return delegate(T1 arg1, T2 arg2) { return (TResult)method.Invoke(arg1, new object[] { arg2 }); };
#endif
}
internal static Action<T1, T2> CreateDelegateAction<T1, T2>(MethodInfo method)
{
#if !NOCREATEDELEGATE
object tdelegate = Delegate.CreateDelegate(typeof(Action<T1, T2>), null, method, true);
return (Action<T1, T2>)tdelegate;
#else
if (method.IsStatic)
{
return delegate(T1 arg1, T2 arg2) { method.Invoke(null, new object[] {arg1, arg2}); };
}
return delegate(T1 arg1, T2 arg2) { method.Invoke(arg1, new object[] { arg2 }); };
#endif
}
} }
} }

@ -84,9 +84,8 @@ namespace Google.ProtocolBuffers.FieldAccess
{ {
throw new ArgumentException("Not all required properties/methods available"); throw new ArgumentException("Not all required properties/methods available");
} }
clearDelegate = (Func<TBuilder, IBuilder>) clearDelegate = ReflectionUtil.CreateDelegateFunc<TBuilder, IBuilder>(clearMethod);
FrameworkPortability.CreateDelegate(typeof(Func<TBuilder, IBuilder>), null, clearMethod); countDelegate = ReflectionUtil.CreateDelegateFunc<TMessage, int>(countProperty.GetGetMethod());
countDelegate = (Func<TMessage, int>)FrameworkPortability.CreateDelegate(typeof(Func<TMessage, int>), null, countProperty.GetGetMethod());
getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod()); getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod());
addValueDelegate = ReflectionUtil.CreateDowncastDelegateIgnoringReturn<TBuilder>(addMethod); addValueDelegate = ReflectionUtil.CreateDowncastDelegateIgnoringReturn<TBuilder>(addMethod);
getRepeatedWrapperDelegate = ReflectionUtil.CreateUpcastDelegate<TBuilder>(builderProperty.GetGetMethod()); getRepeatedWrapperDelegate = ReflectionUtil.CreateUpcastDelegate<TBuilder>(builderProperty.GetGetMethod());

@ -67,11 +67,8 @@ namespace Google.ProtocolBuffers.FieldAccess
throw new ArgumentException("Not all required properties/methods available"); throw new ArgumentException("Not all required properties/methods available");
} }
clrType = messageProperty.PropertyType; clrType = messageProperty.PropertyType;
hasDelegate = hasDelegate = ReflectionUtil.CreateDelegateFunc<TMessage, bool>(hasProperty.GetGetMethod());
(Func<TMessage, bool>) clearDelegate = ReflectionUtil.CreateDelegateFunc<TBuilder, IBuilder>(clearMethod);
FrameworkPortability.CreateDelegate(typeof(Func<TMessage, bool>), null, hasProperty.GetGetMethod());
clearDelegate =
(Func<TBuilder, IBuilder>)FrameworkPortability.CreateDelegate(typeof(Func<TBuilder, IBuilder>), null, clearMethod);
getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod()); getValueDelegate = ReflectionUtil.CreateUpcastDelegate<TMessage>(messageProperty.GetGetMethod());
setValueDelegate = ReflectionUtil.CreateDowncastDelegate<TBuilder>(builderProperty.GetSetMethod()); setValueDelegate = ReflectionUtil.CreateDowncastDelegate<TBuilder>(builderProperty.GetSetMethod());
} }

Loading…
Cancel
Save