1
1
using System ;
2
- using System . Collections . Generic ;
3
- using System . Globalization ;
4
2
using System . Linq ;
5
3
using System . Reflection ;
6
4
using System . Runtime . Serialization ;
5
+ using System . Security ;
7
6
8
7
namespace NHibernate . Util
9
8
{
@@ -28,39 +27,38 @@ public static SerializableMethodInfo Wrap(MethodInfo methodInfo)
28
27
/// Creates a new <see cref="SerializableMethodInfo"/>
29
28
/// </summary>
30
29
/// <param name="methodInfo">The <see cref="MethodInfo"/> being wrapped for serialization.</param>
31
- public SerializableMethodInfo ( MethodInfo methodInfo )
30
+ private SerializableMethodInfo ( MethodInfo methodInfo )
32
31
{
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 ) ) ;
40
35
}
41
36
42
37
private SerializableMethodInfo ( SerializationInfo info , StreamingContext context )
43
38
{
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" ) ;
46
41
SerializableSystemType [ ] parameterSystemTypes = info . GetValue < SerializableSystemType [ ] > ( "parameterTypesHelper" ) ;
47
42
48
43
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 ,
51
46
BindingFlags . DeclaredOnly | BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic , null , parameterTypes , null ) ;
47
+
48
+ if ( _methodInfo == null ) throw new MissingMethodException ( declaringType . FullName , methodName ) ;
52
49
}
53
50
51
+ [ SecurityCritical ]
54
52
public void GetObjectData ( SerializationInfo info , StreamingContext context )
55
53
{
56
54
SerializableSystemType [ ] parameterSystemTypes =
57
- _methodInfo ? . GetParameters ( )
58
- . Select ( x => new SerializableSystemType ( x . ParameterType ) )
55
+ _methodInfo . GetParameters ( )
56
+ . Select ( x => SerializableSystemType . Wrap ( x . ParameterType ) )
59
57
. ToArray ( ) ;
60
58
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 ) ;
64
62
}
65
63
66
64
public MethodInfo Value => _methodInfo ;
@@ -74,14 +72,32 @@ public override bool Equals(object obj)
74
72
{
75
73
if ( ReferenceEquals ( null , obj ) ) return false ;
76
74
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 ) ;
80
76
}
81
77
82
78
public override int GetHashCode ( )
83
79
{
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 ) ;
85
101
}
86
102
}
87
103
}
0 commit comments