0

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タイプの例外にコンストラクターが定義されていないというエラーが表示されます。これを回避するにはどうすればよいですか?プライベートフィールドを書くために、ある種のリフレクショントリックを使用する必要がありますか?

4

1 に答える 1

0

Type.GetConstructor(Type [])を使用して、適切な例外コンストラクターを取得します。http://msdn.microsoft.com/en-us/library/h93ya84h.aspx

このようなもの:

throw (Exception)_convertToType
    .GetConstructor(new Type[]{ typeof(string), typeof(Exception) })
    .Invoke(new object[]{ _catchExceptionType });
于 2012-07-17T13:44:31.137 に答える