/// <summary> /// Gets the introduced field. /// Since the attribute may be at assembly level, the advised type is given as parameter /// A cache is kept, by target type. /// </summary> /// <param name="targetType">Type of the target.</param> /// <param name="targetName"></param> /// <returns></returns> private FieldInfo GetIntroducedField(Type targetType, string targetName) { lock (_fieldInfos) { var key = Tuple.Create(targetType, targetName); if (_fieldInfos.TryGetValue(key, out var introducedField)) { return(introducedField); } _fieldInfos[key] = introducedField = Invocation.FindIntroducedField(_ownerAdvice, _ownerMemberInfo, targetType, targetName); return(introducedField); } }
/// <summary> /// Gets the introduced field. /// Since the attribute may be at assembly level, the advised type is given as parameter /// A cache is kept, by target type. /// </summary> /// <param name="targetType">Type of the target.</param> /// <returns></returns> private FieldInfo GetIntroducedField(Type targetType) { lock (_fieldInfos) { FieldInfo introducedField; if (_fieldInfos.TryGetValue(targetType, out introducedField)) { return(introducedField); } _fieldInfos[targetType] = introducedField = Invocation.FindIntroducedField(_ownerAdvice, _ownerMemberInfo, targetType); return(introducedField); } }
/// <summary> /// Gets the introduced field. /// Since the attribute may be at assembly level, the advised type is given as parameter /// A cache is kept, by target type. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> protected FieldInfo GetIntroducedField(IAdviceContextTarget context) { var targetType = context.TargetType; // this is where the advice is applied (method, property, event). For shared events this is instance-wide, so unrelated to any target var targetName = IsShared ? null : context.TargetName; var fieldInfos = GetIntroducedFieldsRegistry(context); lock (fieldInfos) { //var key = Tuple.Create(targetType, targetName); var key = new IntroducedFieldsRegistry.Key(_ownerAdvice.GetType(), _ownerMemberInfo, targetName); if (fieldInfos.Fields.TryGetValue(key, out var introducedField)) { return(introducedField); } fieldInfos.Fields[key] = introducedField = Invocation.FindIntroducedField(_ownerAdvice, _ownerMemberInfo, targetType, targetName); return(introducedField); } }