LINQ 调用来自其他 class 的私有列表

LINQ call on private List from other class

假设我有一个 class A,它有一个私有列表 Plist 以及与其进行基本交互(添加、删除等)所需的功能。在我的 class B 中,我使用了这些函数,但也想通过 LINQ 以许多不同的方式 iterate/search/whatever 覆盖它。为每个查询创建一个新函数似乎不合理,所以我想知道我是否可以创建一个将查询作为参数并将其应用于私有列表的函数。我知道这在很大程度上违背了首先将列表设为私有的意义,但是我想知道这是否可能

从技术上讲,我希望它像这样工作(显然不是,但你明白了):

public class A
{
    private List<C> Plist { get; set; } = new List<C>();


    public C Search(string query)
    {
        this.Plist.query
    }
}

public class B
{
    A a = new A();

    a.Search("Where(i => i.AnotherListInC.Contains(SomeObject))");
}

有没有办法通过复杂的 LINQ 查询访问私有 属性,或者更一般地说,将字符串连接到现有代码以创建新代码?

如果您需要使用 String 作为参数,这将很困难,因为您必须发出代码。 如果您只想搜索私有列表而不是创建接受谓词作为参数的方法:

public class A
{
    private List<C> Plist { get; set; } = new List<C>();
    public IEnumerable<C> Search(Func<C, bool> predicate)
    {
        return this.Plist.Where(predicate);
    }
}

public class B
{
    public void SomeMethod()
    {
        A a = new A();
        a.Search(i => i.AnotherListInC.Contains(SomeObject));
    }
}

可以为任何Linq方法编写类似的方法。只需创建接受与 Linq 方法相同的参数的方法,除了第一个参数 (IEnumerable<TSource>).

如果您想要所有 Linq 方法可用,您可以在 class A

上实施 IEnumerable<C>
public class A : IEnumerable<C>
{
    private List<C> Plist { get; set; } = new List<C>();

    public IEnumerator<C> GetEnumerator()
    {
        return ((IEnumerable<C>)Plist).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<C>)Plist).GetEnumerator();
    }
}

public class B
{
    public void SomeMethod()
    {
        A a = new A();
        a.Where(i => i.AnotherListInC.Contains(SomeObject));
        a.Any(i => i.AnotherListInC.Contains(SomeObject));
    }
}