LINQ呼叫其他班级的私人名单

时间:2019-01-04 10:35:50

标签: c# linq private

假设我有一个类A,它具有私有的List Plist和与其基本交互(添加,删除等)所需的功能。在我的B类中,我使用了这些函数,但也想以许多不同的方式通过LINQ对其进行迭代/搜索/遍历。为每个查询创建一个新函数似乎是不合理的,因此我想知道是否可以创建一个将查询作为参数并将其应用于私有列表的函数。我知道,这几乎使最初设置为私有列表的目的大打折扣,但是我想知道是否有可能

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

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查询访问私有属性,或更普遍的是将字符串连接到现有代码以创建新代码?

1 个答案:

答案 0 :(得分:4)

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

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方法都可用,则可以在类IEnumerable<C>上实现A

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));
    }
}