2012-10-09 59 views
3

我正在研究PostSharp中的各種概念。使用PostSharp在c#中的構造函數應用方面

更新:

這是我的節目類作爲

namespace myconstructor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      createfolder(); 
      streamfolder(); 
     } 
     public static void createfolder() 
     { 
      File.Create("E:/samplefile.txt"); 

     } 
     public static void streamfolder() 
     { 
      StreamWriter sw = new StreamWriter("E:/samplestream.txt"); 
     } 
    } 

} 

和我的方面類作爲

1)一些跟蹤方面類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using PostSharp.Extensibility; 
using PostSharp.Aspects.Dependencies; 
using PostSharp.Aspects; 
using PostSharp.Aspects.Advices; 
using System.Reflection; 
using System.Linq.Expressions; 

namespace MyProviders 
{ 
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Event)] 
    [MulticastAttributeUsage(MulticastTargets.Event, AllowMultiple = false)] 
    [AspectTypeDependency(AspectDependencyAction.Commute,typeof(SomeTracingAspect))] 
    [Serializable] 
    public class SomeTracingAspect : EventLevelAspect 
    { 
     [OnMethodEntryAdvice, MethodPointcut("SelectConstructors")] 
     public void OnConstructorEntry(MethodExecutionArgs args) 
     { 
      args.ReturnValue = "aspectfile"; 
     } 

     IEnumerable<ConstructorInfo> SelectConstructors(EventInfo target) 
     { 
      return target.DeclaringType.GetConstructors(
         BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
     } 

     public override void RuntimeInitialize(EventInfo eventInfo) 
     { 
      base.RuntimeInitialize(eventInfo); 

     } 
    } 

} 

2 )TraceAspectProvid呃類:

using System; using System.Collections.Generic;使用System.Linq的 ; using System.Text; 使用PostSharp.Aspects; using System.Reflection;

命名空間MyProviders { 公共類TraceAspectProvider:IAspectProvider { 只讀SomeTracingAspect aspectToApply =新SomeTracingAspect();

public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     Assembly assembly = (Assembly)targetElement; 

     List<AspectInstance> instances = new List<AspectInstance>(); 
     foreach (Type type in assembly.GetTypes()) 
     { 
      ProcessType(type, instances); 
     } 

     return instances; 
    } 

    private void ProcessType(Type type, List<AspectInstance> instances) 
    { 
     foreach (ConstructorInfo target in type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)) 
     { 
      instances.Add(new AspectInstance(target, aspectToApply)); 
     } 

     foreach (Type nestedType in type.GetNestedTypes()) 
     { 
      ProcessType(nestedType, instances); 
     } 

} } }

和我的方面文件給出

"C:\Program Files\PostSharp 2.1\Release\postsharp.4.0-x86-cil.exe" "D:\fileaspecttest\myconstructor.exe" /p:AspectProviders=MyProviders.AspectProvider,MyProviders /p:Output="D:\fileaspecttest\myaspect.exe" 

我得到錯誤的

error PS0125: An unexpected exception occured when executing user code: System.ArgumentNullException: Value cannot be null. 
error PS0125: Parameter name: type 
error PS0125: at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
error PS0125: at ^7HtKTJrYMoHj.^kfEQVEmN.^jK8C2yxJ() 
error PS0125: at PostSharp.Sdk.Utilities.ExceptionHelper.ExecuteUserCode[T](MessageLocation messageLocation, Func`1 userCode, Type[] acceptableExceptions) 

等待您的解決方案和響應

+0

@DustinDavis你能提供一個解決方案嗎? – GowthamanSS

+0

你目前的做法出了什麼問題? –

回答

3

我認爲你的主要問題是你試圖在第三方庫(mscorlib)上應用方面。你可以看看Dustin's blog post on how to do this這可能會幫助你。請正式考慮這不被PostSharp支持。

爲了將方面應用於構造函數,您可以使用TypeLevelAspectMulticastPointcutits Targets set to e.g. InstanceConstructor

當你不能使用TypeLevelAspect(例如你要應用到事件方面)我以前用過一個OnMethodEntryAdviceMethodPointCut。這使您可以手動搜索構造函數。

[OnMethodEntryAdvice, MethodPointcut("SelectConstructors")] 
public void OnConstructorEntry(MethodExecutionArgs args) 
{ 
    ... 
} 

IEnumerable<ConstructorInfo> SelectConstructors(EventInfo target) 
{ 
    return target.DeclaringType.GetConstructors(
     BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
} 

一個更加廣泛的討論我如何應用這個從構造函數can be found on my blog初始化事件。

該類的最新完整源代碼can be found on github。自博客文章以來,我做了一些更改,但針對構造函數的原則保持不變。

+0

感謝您的解決方案將檢查並更新您 – GowthamanSS

+0

我可以用StreamWriter代替SelectConstructors在[OnMethodEntryAdvice,MethodPointcut(「SelectConstructors」)]爲了解決我的問題 – GowthamanSS

+0

@GowthamanSS我不是100%確定你會能夠調整參數,我建議你嘗試一下,但是在'OnConstructorEntry()'方法中,你需要定義在構造函數開始時需要注入的代碼。您可以通過'args.Arguments'訪問構造函數參數。 –

相關問題