2013-10-07 62 views
0

我有即時施加到一類的屬性以下代碼和屬性的類內:爲什麼ProvideAspects方法在實例化時不將屬性添加到IL?

public class SerialiseAttribute : Attribute, IAspectProvider, IValidableAnnotation { 

    public string ApplyToProperty { get; set; } 

    public string Name { get; set; } 

    public bool Ignore { get; set; } 

    bool IValidableAnnotation.CompileTimeValidate(object target) { return true; } 

    IEnumerable<AspectInstance> IAspectProvider.ProvideAspects(object targetElement) { 
     var type = targetElement as Type; 

     if (type != null && !FastSerialisationCacheAttribute.AppliedTo.Contains(type)) { 
      FastSerialisationCacheAttribute.AppliedTo.Add(type); 
      yield return new AspectInstance(type, new FastSerialisationCacheAttribute()); 
     } 
    } 

} 

這intialises的FastSerialisationCacheAttribute並執行CompileTimeInitialize成功(其從TypeLevelAspect方面導出)。但是,當我檢查生成的IL時,在提供的類型上沒有FastSerialisationCacheAttribute,也不能在運行時找到使用反射的類型。

如果我切換出ProviderAspects功能與此代碼:

IEnumerable<AspectInstance> IAspectProvider.ProvideAspects(object targetElement) { 
    var type = targetElement as Type; 

    if (type != null && !FastSerialisationCacheAttribute.AppliedTo.Contains(type)) { 
     FastSerialisationCacheAttribute.AppliedTo.Add(type); 
     var constructor = typeof(FastSerialisationCacheAttribute).GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); 
     var objectConstruction = new ObjectConstruction(constructor); 
     var introduceCacheAspect = new CustomAttributeIntroductionAspect(objectConstruction); 
     yield return new AspectInstance(type, introduceCacheAspect); 
    } 
} 

然後,它增加了屬性IL,但這並不初始化屬性(執行CompileTimeInitialize)。

回答

0

嗯,我認爲你已經非常接近你的問題的解決方案。如果要動態引入aspect和attribute,則需要從ProvideAspects方法中返回FastSerialisationCacheAttributeCustomAttributeIntroductionAspect的實例。

方法IAspectProvider.ProvideAspects執行所有先前應用的方面屬性已從程序集中讀取。如果你在第二個例子中引入了另一個屬性,那麼它已經爲時已晚,導致方面介紹。

IAspectProvider.ProvideAspects中,您通常會爲目標引入其他方面。如果您確實需要介紹實際屬性,那麼您將使用CustomAttributeIntroductionAspect

請注意,添加屬性通常不需要方面工作,但我不知道代碼中的邏輯是什麼。

相關問題