【问题标题】:Is there any way to share the private field for "different level" (e.g. collection) of the same class?有没有办法共享同一类的“不同级别”(例如集合)的私有字段?
【发布时间】:2021-10-29 20:57:15
【问题描述】:

我希望只为一个类的列表调用一些方法。

虽然只能为 List 定义扩展方法,但它无法访问目标类中的私有字段(参见代码),因为它被视为完全不同的类类型。

我知道在 C++ 中,friend 可以设置一些方法访问私有数据。但是C#不能

那么,有没有什么优雅的模式可以在 T 和 List 之间共享私有数据?

例如:

class Solid
{ 
private Faces[] f;
...
}
public static class SolidExtensions
{
    public static Solid Merge(this IList<Solid> Solids)
     {
          //Get all faces from Solids. //not possible
           return Build(faces);
     }
}

【问题讨论】:

标签: c#


【解决方案1】:

我认为这是你唯一的方法:

class Solid
{
    private Faces[] f;
    
    public static Solid Merge(IList<Solid> solids)
    {
        Faces[] faces = solids.SelectMany(x => x.f).ToArray();
        return Build(faces);
    }

    private static Solid Build(Faces[] faces)
    {
        throw new NotImplementedException();
    }
}

你可以称它为Solid.Merge(solids)

【讨论】:

  • 我认为这个解决方案是对的。如果您的方法需要访问私有字段,则属于该类。
  • 是的,这就是我正在使用的方法。但是,我认为它应该归类为“实用程序”或“批处理”。使用静态 Merge 可能不遵循一些设计原则?我认为..
  • 另一种选择是使用某种依赖注入框架和工厂方法来创建一个隐藏在接口后面的私有类,它能够访问私有成员。但这开始变得复杂了。
【解决方案2】:

您必须使您的阵列可以从外部访问。如果您不希望其他类能够修改您的数组,可以将其公开为IEnumerable&lt;Faces&gt;

class Solid
{ 
    private Faces[] f;
    public IEnumerable<Faces> Faces
    {
        get { return f; }
    }
}

这是您访问它的方式:

public static class SolidExtensions
{
    public static Solid Merge(this IList<Solid> Solids)
     {
           var allFaces = Solids.SelectMany(x => x.Faces);
           return Build(allFaces);
     }
}

【讨论】:

  • 谢谢,关键问题是我想让 Faces 保持私密...
  • 您想将Faces 保密,但您想访问它?然后将Merge 放入Solid
  • 谢谢你,@Enigmativity。可悲的是,我认为 Merge 更好地处理一组实体,它可能不等同于一个一个地处理单个实体。
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2023-04-03
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多