Aタイプの例外をラップしてBタイプとして出力するポストシャープアスペクトを記述します。これは場合によっては一般的なパターンであるため、ボイラープレートのほとんどを削除する必要があります。問題は、アクティベーターで例外を作成するときに内部例外を設定する方法です。
namespace PostSharpAspects.ExceptionWrapping
{
[Serializable]
public class WrapExceptionsAttribute : OnMethodBoundaryAspect
{
private readonly Type _catchExceptionType;
private readonly Type _convertToType;
public WrapExceptionsAttribute(Type catchTheseExceptions, Type convertThemToThisType)
{
_catchExceptionType = catchTheseExceptions;
_convertToType = convertThemToThisType;
}
public override void OnException(MethodExecutionArgs args)
{
if (args.Exception.GetType() == _catchExceptionType)
{
throw (Exception) Activator.CreateInstance(_convertToType);
}
}
}
}
次のコマンドで内部例外を設定しようとすると、throw(Exception)Activator.CreateInstance(_convertToType、args.Exception);
xxxxタイプの例外にコンストラクターが定義されていないというエラーが表示されます。これを回避するにはどうすればよいですか?プライベートフィールドを書くために、ある種のリフレクショントリックを使用する必要がありますか?