C#中如何创建Lazy属性并传入当前类字符串属性?能否传入Name属性至Lazy BOM初始化?
嘿,这两个问题其实是一回事儿,我给你直接上代码示例,再讲清楚细节:
在C#中创建带当前类属性参数的Lazy属性
要实现这个需求,核心是利用Lazy<T>的工厂委托特性——它允许我们在初始化Lazy对象时,引用当前类的任意成员(包括你的Name字符串属性)。
完整代码示例
// 假设你的BOM类结构是这样的 public class Bom { public string InstanceName { get; } // 构造函数接收字符串参数 public Bom(string name) { InstanceName = name; } } public class MyClass { // 你的目标字符串属性 public string Name { get; set; } = "DefaultProductName"; // 方式1:在构造函数中初始化Lazy public Lazy<Bom> LazyBomFromCtor { get; } // 方式2:在getter中延迟初始化(适合属性可能不被用到的场景) private Lazy<Bom> _lazyBomFromGetter; public Lazy<Bom> LazyBomFromGetter { get { if (_lazyBomFromGetter == null) { // 通过闭包捕获当前实例的Name属性,传给Bom的构造函数 _lazyBomFromGetter = new Lazy<Bom>(() => new Bom(Name)); } return _lazyBomFromGetter; } } public MyClass() { // 构造函数里同样可以直接引用Name属性 LazyBomFromCtor = new Lazy<Bom>(() => new Bom(Name)); } }
关键细节说明
- Lazy的初始化时机:
Lazy<T>只会在你第一次访问它的Value属性时执行工厂方法(也就是() => new Bom(Name)这段代码)。这意味着如果你的Name属性在第一次访问LazyBom.Value之前被修改,Bom实例会使用修改后的Name值;但一旦Bom被初始化,后续修改Name不会影响已创建的Bom实例(因为Lazy只会初始化一次)。
举个例子:var myObj = new MyClass(); myObj.Name = "UpdatedProductName"; var bom = myObj.LazyBomFromCtor.Value; // bom.InstanceName = "UpdatedProductName" myObj.Name = "AnotherName"; var sameBom = myObj.LazyBomFromCtor.Value; // 还是同一个实例,InstanceName依然是"UpdatedProductName"
是否存在将Name属性传入Lazy BOM初始化的实现方式?
当然存在!上面的代码就是最直接的实现方式。只要在Lazy<T>的工厂委托(Func<T>)中引用当前类的Name属性,就能把它作为参数传递给Bom的构造函数。
如果需要每次都用最新的Name值?
如果你希望每次获取Bom实例时都使用当前最新的Name,那Lazy<T>就不适用了——因为它的核心是“延迟初始化且只初始化一次”。这种情况你可以直接写一个方法:
public Bom GetLatestBom() { return new Bom(Name); }
每次调用这个方法都会创建一个新的Bom实例,使用当前最新的Name值。
内容的提问来源于stack exchange,提问作者ehh
相关产品推荐
相关产品推荐

