@@ -27,12 +27,30 @@ protected References(ModuleWeaver moduleWeaver)
2727
2828 public MethodReference GetTypeFromHandleMethod { get ; protected set ; }
2929
30+ public MethodReference MemoryCacheEntryOptionsAbsoluteExpirationRelativeToNowSetter { get ; set ; }
31+
32+ public MethodReference MemoryCacheEntryOptionsConstructor { get ; set ; }
33+
34+ public MethodReference MemoryCacheEntryOptionsPrioritySetter { get ; set ; }
35+
36+ public MethodReference MemoryCacheEntryOptionsSlidingExpirationSetter { get ; set ; }
37+
38+ public TypeReference MemoryCacheEntryOptionsType { get ; set ; }
39+
3040 public TypeReference MemoryCacheInterface { get ; protected set ; }
3141
3242 public TypeReference NoCacheAttributeType { get ; set ; }
3343
44+ public MethodReference NullableTimeSpanConstructor { get ; set ; }
45+
3446 public MethodReference SetMethod { get ; protected set ; }
3547
48+ public MethodReference SetMethodWithMemoryCacheEntryOptions { get ; protected set ; }
49+
50+ public MethodReference TimeSpanFromSecondsMethod { get ; set ; }
51+
52+ public TypeReference TimeSpanType { get ; set ; }
53+
3654 public MethodReference TryGetValueMethod { get ; protected set ; }
3755
3856 public TypeReference TypeType { get ; protected set ; }
@@ -63,19 +81,52 @@ public static References Init(ModuleWeaver moduleWeaver)
6381 references . GetTypeFromHandleMethod =
6482 moduleWeaver . ModuleDefinition . ImportReference ( type . Methods . Single ( x => x . Name == nameof ( Type . GetTypeFromHandle ) ) ) ;
6583
84+ TypeDefinition timeSpanType = moduleWeaver . FindTypeDefinition ( typeof ( TimeSpan ) . FullName ) ;
85+ references . TimeSpanType = moduleWeaver . ModuleDefinition . ImportReference ( timeSpanType ) ;
86+ references . TimeSpanFromSecondsMethod =
87+ moduleWeaver . ModuleDefinition . ImportReference ( timeSpanType . Methods . Single ( x => x . Name == nameof ( TimeSpan . FromSeconds ) ) ) ;
88+
89+ TypeDefinition nullableType = moduleWeaver . FindTypeDefinition ( typeof ( Nullable < > ) . FullName ) ;
90+ references . NullableTimeSpanConstructor =
91+ moduleWeaver . ModuleDefinition . ImportReference ( nullableType . GetConstructors ( )
92+ . Single ( )
93+ . MakeHostInstanceGeneric ( references . TimeSpanType ) ) ;
94+
6695 TypeDefinition memoryCacheInterface = moduleWeaver . FindTypeDefinition ( "Microsoft.Extensions.Caching.Memory.IMemoryCache" ) ;
6796 references . MemoryCacheInterface = moduleWeaver . ModuleDefinition . ImportReference ( memoryCacheInterface ) ;
6897
6998 TypeDefinition cacheExtensions = moduleWeaver . FindTypeDefinition ( "Microsoft.Extensions.Caching.Memory.CacheExtensions" ) ;
7099 references . CacheExtensionsType = moduleWeaver . ModuleDefinition . ImportReference ( cacheExtensions ) ;
71100
101+ TypeDefinition memoryCacheEntryOptions =
102+ moduleWeaver . FindTypeDefinition ( "Microsoft.Extensions.Caching.Memory.MemoryCacheEntryOptions" ) ;
103+ references . MemoryCacheEntryOptionsType = moduleWeaver . ModuleDefinition . ImportReference ( memoryCacheEntryOptions ) ;
104+ references . MemoryCacheEntryOptionsConstructor =
105+ moduleWeaver . ModuleDefinition . ImportReference ( memoryCacheEntryOptions . GetConstructors ( ) . Single ( x => ! x . Parameters . Any ( ) ) ) ;
106+ references . MemoryCacheEntryOptionsAbsoluteExpirationRelativeToNowSetter =
107+ moduleWeaver . ModuleDefinition . ImportReference ( memoryCacheEntryOptions . Properties
108+ . Single ( x => x . Name == "AbsoluteExpirationRelativeToNow" )
109+ . SetMethod ) ;
110+ references . MemoryCacheEntryOptionsSlidingExpirationSetter =
111+ moduleWeaver . ModuleDefinition . ImportReference ( memoryCacheEntryOptions . Properties . Single ( x => x . Name == "SlidingExpiration" )
112+ . SetMethod ) ;
113+ references . MemoryCacheEntryOptionsPrioritySetter =
114+ moduleWeaver . ModuleDefinition . ImportReference (
115+ memoryCacheEntryOptions . Properties . Single ( x => x . Name == "Priority" ) . SetMethod ) ;
116+
72117 references . TryGetValueMethod =
73118 moduleWeaver . ModuleDefinition . ImportReference ( cacheExtensions . Methods . Single ( x => x . Name == "TryGetValue" ) ) ;
74119
75120 references . SetMethod =
76121 moduleWeaver . ModuleDefinition . ImportReference ( cacheExtensions . Methods . Single ( x =>
77122 x . Name == "Set" && x . HasParameters && x . Parameters . Count == 3 ) ) ;
78123
124+ references . SetMethodWithMemoryCacheEntryOptions = moduleWeaver . ModuleDefinition . ImportReference (
125+ cacheExtensions . Methods . Single ( x =>
126+ x . Name == "Set" && x . HasParameters && x . Parameters . Count == 4 &&
127+ moduleWeaver . ModuleDefinition . ImportReference ( x . Parameters . Last ( ) . ParameterType ) . Resolve ( ) ==
128+ references . MemoryCacheEntryOptionsType . Resolve ( ) ) ) ;
129+
79130 return references ;
80131 }
81132
@@ -99,6 +150,9 @@ public TypeReference GetFragmentedSystemTupleType(ICollection<TypeReference> typ
99150 public MethodReference GetGenericSetMethod ( TypeReference type ) =>
100151 ModuleWeaver . ModuleDefinition . ImportReference ( SetMethod . MakeGeneric ( type ) ) ;
101152
153+ public MethodReference GetGenericSetMethodWithMemoryCacheEntryOptions ( TypeReference type ) =>
154+ ModuleWeaver . ModuleDefinition . ImportReference ( SetMethodWithMemoryCacheEntryOptions . MakeGeneric ( type ) ) ;
155+
102156 public MethodReference GetSystemTupleConstructor ( params TypeReference [ ] types )
103157 {
104158 if ( types . Length > 8 )
0 commit comments