我想使用 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/