使用 PostSharp 在 C# 中的构造函数上应用方面

2023-12-07

我正在 PostSharp 中研究各种概念。

Updated:

这是我的程序类

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)TraceAspectProvider类:

使用系统; 使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本; 使用 PostSharp.Aspects; 使用系统反射;

命名空间 MyProviders { 公共类 TraceAspectProvider :IAspectProvider { 只读 SomeTracingAspectspectToApply = new 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)

等待您的解决方案和回复


我认为您的主要问题是您正在尝试在第三方库(mscorlib)上应用方面。你可以看一下达斯汀 (Dustin) 的博客文章介绍了如何执行此操作这可能会帮助你。请正式考虑到 PostSharp 不支持这一点。

为了将方面应用于构造函数,您可能可以使用TypeLevelAspect and a MulticastPointcut with its Targets设置为例如InstanceConstructor.

当你无法使用TypeLevelAspect(例如,您想将方面应用于事件)我之前使用过OnMethodEntryAdvice and a MethodPointCut。这允许您手动搜索构造函数。

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

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

更广泛的讨论我如何应用它来初始化构造函数中的事件可以在我的博客上找到.

该类最新完整源码可以在github上找到。自博客文章发布以来,我已经进行了一些更改,但定位构造函数的原则保持不变。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PostSharp 在 C# 中的构造函数上应用方面 的相关文章

随机推荐

  • 根据条件重置累计计数

    我有一个与此类似的数据框 df pd DataFrame col1 a a a a a a b b b c c c c col2 1 1 1 1 2 2 1 1 2 1 1 2 2 col3 1 1 0 0 0 0 0 1 0 1 1 1
  • bash 中参数过多错误

    我正在编写一个脚本来删除目录中的所有文件以供练习 我在变量周围使用引号 但仍然收到以下错误 usr local bin deleteall line 6 too many arguments usr local bin deleteall
  • javascript 选择更改字段价格并带有折扣 onchange [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个带有小计 折扣和总计的 html 表单 折扣的选择下拉菜单有 5 10 和 20 值 小计的选择下拉菜单有 200 100 和 20 值 另一个输入文本字段获取总计表单
  • 如何将焦点集中到消息框?

    Private Sub CommandButton1 Click Dim i As Long Dim xreply As Integer Dim names As Long Dim IE As Object i ActiveSheet Ra
  • 你能写一个无法实现的接口吗?

    这与java中的最终接口 在讨论中 有一个观点认为与接口相关的 Final 概念是不明确的 最终接口是否意味着它不能有子接口 这是否意味着它不能实现 这是第一个问题 你能编写一个最终接口 这样编译器就会阻止你实现它吗 正如我将展示的 可以使
  • 如何添加js条件

    Hi我想在 JS 中编写一个条件 这将导致添加外部 js 例如 如果条件是 x gt 2 并且为 true 那么我希望它加载不同的外部 js 文件 但如果为 false 则加载另一个 js 文件 我该如何写呢 Thanks var file
  • C#中“<<”代表什么? [复制]

    这个问题在这里已经有答案了 Serializable Flags public enum SiteRoles User 1 lt lt 0 Admin 1 lt lt 1 Helpdesk 1 lt lt 2 这意味着向左移位 所以 int
  • Node.js 不支持 ES6 导入和导出

    我正在使用 WebStorm 2016 2 2 构建一个项目 我使用 Node js 6 6 0 版本 我已将 JavaScript 版本设置为 ES6 但两者都出现 意外令牌 错误import and export关键词 顺便说一句 我没
  • 在 Fortran 中显示包含两列的表格以及可用数据

    我有两个变量说x and y两者都有大约 60 分 基本上是x and y绘图的轴 现在 当我尝试以列或表的形式在结果文件中显示它时x值和对应的y我最终得到了所有的值x两列中显示的值 然后是y价值观 我无法正确地将其取出 这是代码的一小部分
  • ES6 类:通过应用于方法的“addEventListener”访问“this”[重复]

    这个问题在这里已经有答案了 在此 es6 脚本中 单击事件不起作用 因为sayHello方法被调用this elm div as this 如何在不失去范围的情况下将事件与方法关联 class player constructor name
  • 在 html 中加载 javascript 的理想位置在哪里? [复制]

    这个问题在这里已经有答案了 我理解分散在 html 代码中的内联 javascript 如下例所示 这很糟糕 p Foo p 然而 经过一段时间的编码后 了解在文档末尾加载 JavaScript 是最好的方法 我确实看到很多网站都符合在文档
  • 在 Python 中获取精确的 Android GPS 位置

    我尝试在 Python 中获取 Android 手机的 GPS 位置 使用 QPython3 应用程序 这种方法可行 但 Android 中似乎有几个 LocationProvider gps 纯gps定位 速度慢 耗能 但非常准确 正是我
  • 如何在线程完成可运行后停止线程?

    我有一个任务列表和有限数量的线程 目标是计算使用此数量的线程完成任务所需的时间 我知道我使用线程的方式有问题Runnable目的 我对他们来说是新手 似乎不知道如何解决它 它的错误是java lang OutOfMemoryError Ja
  • Twitter Bootstrap - 在行之间添加顶部空间

    如何添加边距顶部class row 使用 twitter bootstrap 框架的元素 在 Twitter bootstrap 中编辑或覆盖行是一个坏主意 因为这是页面脚手架的核心部分 您将需要没有上边距的行 要解决此问题 请创建一个新类
  • 这个片段的复杂度是 O(log^2(n)) 吗?

    如果不是 那么复杂性会是多少 谢谢 public static int f int n int x for int i n i gt 0 i 2 for int j 0 j lt i j x j Assume this operation
  • 在 gitolite 中重新生成authorized_keys 文件?

    是否可以 我的authorized keys 文件被擦除 更新 gitolite 管理规则仅附加到文件 是否可以根据 gitolite 配置重新生成整个文件 编辑 找到了 gitolite trigger POST COMPILE 使用 g
  • Visual Studio 2008 是否支持配置(调试/发布版本)特定参考?

    我有一个本机 C 项目 其中包含一个 C CLI 文件 唯一使用 CLI 编译的文件 我想添加对 C DLL 的引用 有单独的版本用于调试和发布 但是我似乎只能添加一个适用于所有配置的参考 引用搜索路径对话框包含一个警告 如果我尝试使用任何
  • Oracle 11g 重命名。保证是原子的?

    我在 plsql 脚本中有一些 5 重命名语句 drop table new rename old to new 旧 表包含非常有价值的信息 在我看来 如果重命名命令保证是原子的 那么我就解决了一个问题 它是原子的吗 如果没有 有没有办法进
  • 使用 Fancybox 版本 2 - 关闭第二个 fancybox 时重新打开第一个 fancybox 而不是简单地关闭

    使用由以下提供的 Fancybox 版本 2http fancyapps com fancybox support 我想从我的主页打开一个 fancybox 但在第一个 fancybox 中可以调用第二个 fancybox 但是当第二个精美
  • 使用 PostSharp 在 C# 中的构造函数上应用方面

    我正在 PostSharp 中研究各种概念 Updated 这是我的程序类 namespace myconstructor class Program static void Main string args createfolder st