11using System ;
2- using System . Collections . Generic ;
3- using System . Globalization ;
42using System . Linq ;
53using System . Reflection ;
64using System . Runtime . Serialization ;
5+ using System . Security ;
76
87namespace NHibernate . Util
98{
@@ -28,39 +27,38 @@ public static SerializableMethodInfo Wrap(MethodInfo methodInfo)
2827 /// Creates a new <see cref="SerializableMethodInfo"/>
2928 /// </summary>
3029 /// <param name="methodInfo">The <see cref="MethodInfo"/> being wrapped for serialization.</param>
31- public SerializableMethodInfo ( MethodInfo methodInfo )
30+ private SerializableMethodInfo ( MethodInfo methodInfo )
3231 {
33- _methodInfo = methodInfo ;
34- if ( methodInfo != null )
35- {
36- if ( methodInfo . IsStatic ) throw new ArgumentException ( "Only for instance fields" , nameof ( methodInfo ) ) ;
37- if ( methodInfo . DeclaringType == null ) throw new ArgumentException ( "MethodInfo must have non-null DeclaringType" , nameof ( methodInfo ) ) ;
38-
39- }
32+ _methodInfo = methodInfo ?? throw new ArgumentNullException ( nameof ( methodInfo ) ) ;
33+ if ( methodInfo . IsStatic ) throw new ArgumentException ( "Only for instance fields" , nameof ( methodInfo ) ) ;
34+ if ( methodInfo . DeclaringType == null ) throw new ArgumentException ( "MethodInfo must have non-null DeclaringType" , nameof ( methodInfo ) ) ;
4035 }
4136
4237 private SerializableMethodInfo ( SerializationInfo info , StreamingContext context )
4338 {
44- System . Type declaringType = info . GetValue < SerializableSystemType > ( "declaringType" ) ? . GetType ( ) ;
45- string fieldName = info . GetString ( "methodName" ) ;
39+ System . Type declaringType = info . GetValue < SerializableSystemType > ( "declaringType" ) . GetType ( ) ;
40+ string methodName = info . GetString ( "methodName" ) ;
4641 SerializableSystemType [ ] parameterSystemTypes = info . GetValue < SerializableSystemType [ ] > ( "parameterTypesHelper" ) ;
4742
4843 System . Type [ ] parameterTypes = parameterSystemTypes ? . Select ( x => x . GetType ( ) ) . ToArray ( ) ?? new System . Type [ 0 ] ;
49- this . _methodInfo = declaringType ? . GetMethod (
50- fieldName ,
44+ _methodInfo = declaringType . GetMethod (
45+ methodName ,
5146 BindingFlags . DeclaredOnly | BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic , null , parameterTypes , null ) ;
47+
48+ if ( _methodInfo == null ) throw new MissingMethodException ( declaringType . FullName , methodName ) ;
5249 }
5350
51+ [ SecurityCritical ]
5452 public void GetObjectData ( SerializationInfo info , StreamingContext context )
5553 {
5654 SerializableSystemType [ ] parameterSystemTypes =
57- _methodInfo ? . GetParameters ( )
58- . Select ( x => new SerializableSystemType ( x . ParameterType ) )
55+ _methodInfo . GetParameters ( )
56+ . Select ( x => SerializableSystemType . Wrap ( x . ParameterType ) )
5957 . ToArray ( ) ;
6058
61- info . AddValueWithType ( "declaringType" , SerializableSystemType . Wrap ( _methodInfo ? . DeclaringType ) ) ;
62- info . AddValue ( "methodName" , _methodInfo ? . Name ) ;
63- info . AddValueWithType ( "parameterTypesHelper" , parameterSystemTypes ) ;
59+ info . AddValue ( "declaringType" , SerializableSystemType . Wrap ( _methodInfo . DeclaringType ) ) ;
60+ info . AddValue ( "methodName" , _methodInfo . Name ) ;
61+ info . AddValue ( "parameterTypesHelper" , parameterSystemTypes ) ;
6462 }
6563
6664 public MethodInfo Value => _methodInfo ;
@@ -74,14 +72,32 @@ public override bool Equals(object obj)
7472 {
7573 if ( ReferenceEquals ( null , obj ) ) return false ;
7674 if ( ReferenceEquals ( this , obj ) ) return true ;
77- if ( ReferenceEquals ( this . _methodInfo , obj ) ) return true ;
78- if ( obj is SerializableMethodInfo ) return Equals ( ( SerializableMethodInfo ) obj ) ;
79- return ( obj is MethodInfo ) && this . _methodInfo . Equals ( obj ) ;
75+ return obj is SerializableMethodInfo && Equals ( ( SerializableMethodInfo ) obj ) ;
8076 }
8177
8278 public override int GetHashCode ( )
8379 {
84- return _methodInfo . GetHashCode ( ) ;
80+ return ( _methodInfo != null ? _methodInfo . GetHashCode ( ) : 0 ) ;
81+ }
82+
83+ public static bool operator == ( SerializableMethodInfo left , SerializableMethodInfo right )
84+ {
85+ return Equals ( left , right ) ;
86+ }
87+
88+ public static bool operator != ( SerializableMethodInfo left , SerializableMethodInfo right )
89+ {
90+ return ! Equals ( left , right ) ;
91+ }
92+
93+ public static implicit operator MethodInfo ( SerializableMethodInfo serializableMethodInfo )
94+ {
95+ return serializableMethodInfo ? . Value ;
96+ }
97+
98+ public static explicit operator SerializableMethodInfo ( MethodInfo methodInfo )
99+ {
100+ return Wrap ( methodInfo ) ;
85101 }
86102 }
87103}
0 commit comments