在不使用默认构造函数的情况下访问c# Lazy *中的非静态成员



我想添加一个Lazy到我的类。要访问Lazy的初始化方法中的非静态成员,最佳实践方法(参见https://stackoverflow.com/a/14029443/10406502)是在默认构造函数中定义Lazy。这在我的项目中是不可能的,因为它是一个局部类,默认构造函数已经由一些自动生成的代码(实体框架)定义。

是否有一种方法可以使用Lazy访问非静态类成员而无需在默认构造函数中实现它?

感谢Robert Harvey,我找到了以下解决方案:首先,您必须向数据模型模板MyModeName.tt添加一些内容,您可以在项目中的MyModelName.edmx下找到这些内容。我添加了一个新的局部方法private partial void OnConstructorCompletion();,并在构造函数的末尾调用它。我将文档修改如下(第27-67行):

<#=codeStringGenerator.EntityClassOpening(entity)#>
{
private partial void OnConstructorCompletion();
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public <#=code.Escape(entity)#>()
{
<#
foreach (var edmProperty in propertiesWithDefaultValues)
{
#>
this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>;
<#
}
foreach (var navigationProperty in collectionNavigationProperties)
{
#>
this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
}
foreach (var complexProperty in complexProperties)
{
#>
this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>();
<#
}
#>
OnConstructorCompletion();
}

接下来,我实现了所需的方法在我的实体类:

public partial class MyEntity
{
public Lazy<ICollection<MyNavigationEntity>> NavigationProperty;
private partial void OnConstructorCompletion()
{
NavigationProperty= new Lazy<ICollection<MyNavigationEntity>>(() =>
{
DatabaseEntities db = (DatabaseEntities)EntityContextExtensions.GetDbContextFromEntity(this);
return db.MyNavigationEntity
.Where(ne => ne.ID == this.ID_MyNavigationEntity)
.ToHashSet();
});
}
}

相关内容

  • 没有找到相关文章