我有一个DLL程序集,返回List(EmailItem).EmailItem是一个自定义类,包含一些由于执行所花费的处理时间而延迟加载的属性.根据我的业务需求,他们基本上是帮手.
当我在Windows服务和控制台应用程序中使用这些对象时,这些属性静静地等待调用.
但是,如果我使用PoSh检索这些类的集合,然后使用Where-Object过滤它们,即使它们未在Where-Object scriptblock中或脚本中的任何其他位置引用,也会评估这些属性中的每一个.我尝试过编写自定义过滤器但遇到相同的行为.甚至投射我关心使用Select-Object的值也会做同样的事情.
我最好的猜测是,对象正在转换为PSObjects,而PowerShell正在填充属性.
任何想法如何避免这个或关闭此脚本?我正在添加不包含这些帮助程序的"轻量级"对象,但这只是为了支持我最喜欢的Windows脚本语言而烦人的工作量.
谢谢你的任何提示!
这似乎不是一般的.在你的情况下,有一些更微妙的事情发生.
我定义了这个类:
namespace Lazy
{
public class LazyClass
{
public int One { get { return 1; } }
public bool LazyEvaluated { get; private set; }
public string LazyProperty { get { LazyEvaluated = true; return "Lazy"; } }
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行这些命令:
1: $lazy = 1..4 | % { New-Object Lazy.LazyClass }
2: $lazy | % { $_.LazyEvaluated }
3: $lazy | ? { $_.One -eq 1 } | % { $_.LazyEvaluated }
4: $lazy
5: $lazy | ? { $_.One -eq 1 } | % { $_.LazyEvaluated }
Run Code Online (Sandbox Code Playgroud)
命令2的输出为False四次.命令3的输出为False四次.命令4的输出导致在每个对象上计算LazyProperty.命令5的输出为True四次.
我也尝试将这些对象管道化为"select One,LazyEvaluated"并且不会导致对LazyProperty进行评估.
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |