c# - 如何使用 PostSharp 实现延迟加载?

标签 c# lazy-loading aop postsharp

我想使用 PostSharp 对属性实现延迟加载。

为了简短,而不是写作

SomeType _field = null;
private SomeType Field
{
    get
    {
        if (_field == null)
        {
            _field = LongOperation();
        }
        return _field;
    }
}

我想写

[LazyLoadAspect]
private object Field
{
    get
    {
        return LongOperation();
    }
}

因此,我确定我需要在类中发出一些代码以生成支持字段,以及在 getter 方法内部发出一些代码以实现测试。

使用 PostSharp,我正在考虑覆盖 CompileTimeInitialize,但我缺少处理编译代码的知识。

编辑: 该问题可以扩展到任何无参数方法,例如:

SomeType _lazyLoadedField = null;
SomeType LazyLoadableMethod ()
{
    if(_lazyLoadedField ==null)
    {
        // Long operations code...
        _lazyLoadedField = someType;
    }
    return _lazyLoadedField ;
}

会变成

[LazyLoad]
SomeType LazyLoadableMethod ()
{
     // Long operations code...
     return someType;
}

最佳答案

经过我们的评论,我想我现在知道你想要什么了。

[Serializable]
    public class LazyLoadGetter : LocationInterceptionAspect, IInstanceScopedAspect
    {
        private object backing;

        public override void OnGetValue(LocationInterceptionArgs args)
        {
            if (backing == null)
            {
                args.ProceedGetValue();
                backing = args.Value;
            }

            args.Value = backing;
        }

        public object CreateInstance(AdviceArgs adviceArgs)
        {
            return this.MemberwiseClone();
        }

        public void RuntimeInitializeInstance()
        {

        }
    }

测试代码

public class test
    {
        [LazyLoadGetter]
        public int MyProperty { get { return LongOperation(); } }
    }

关于c# - 如何使用 PostSharp 实现延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533656/

相关文章:

c# - 设置winform DataGridView的显示格式

doctrine - 具有自引用 ManyToMany : EXTRA_LAZY fetch mode not working 的继承实体

java - 核心 Java - 创建自定义 AOP

c# - 如何在 Visual Studio 插件的输出窗口中显示控制台输出?

c# - 在 C# 的 linq 中选择大小写

java - FetchType.LAZY 不适用于 hibernate 中的 @ManyToOne 映射

java - Spring AOP 和注释在方法执行之前检查参数

spring - @Transactional 在 @Validated 时不起作用

c# - 如何在运行时才知道类型时创建 Expression.Lambda?

javascript - 带有延迟加载选项的 Owl Carousel 2