Использование метода локального свойства в лямбда-выражении - PullRequest
0 голосов
/ 19 декабря 2018

Я надеюсь, что кто-то сможет сказать мне, если а) то, что я пытаюсь достичь, возможно, и б) как это сделать.

У меня есть частная собственность, определенная вкласс типа, который фактически является списком строк, и в нем есть методы, определенные для него, которые позволяют выполнять поиск в списке на заказ.Могу ли я использовать их в лямбда-выражении?

Например, если у меня есть класс

public class SomeExampleClass : ISomeExampleClass
{

    private readonly IAlistOfBespokeStringsObject _aListOfBespokeStringsObject

И тип свойства AListOfBespokeStringsObject определяется как (он фактически принимает списокзначений из базы данных и заполняет ее):

public class AListOfBespokeStringsObject : IAlistOfBespokeStringsObject
{
    private List<string> _listOfBespokeStrings;

    public AListOfBespokeStringsObject()
    {
        var db = new ListOfBespokeStringsContext();
        _listOfBespokeStrings = db.BespokeString.Select(a => a.String.Replace(" ",string.Empty)).ToList<string>();
    }

    public Boolean CheckBespokeStringList(string stringToBeChecked)
    {
        return _listOfBespokeStrings.Any(a => a.Equals(stringToBeChecked.Replace(" ","")));
    }
}

Возвращаясь к SomeExampleClass, я использую его как своего рода механизм правил, где перечисляются правила и текст правила (в виде строки) передается в лямбда-выражение следующим образом (обратите внимание, что набор данных - это просто тип, из которого состоят наборы коллекционных данных):

foreach (var Rule in _rules)
{  
    var dataSets = mydatasets.AsQueryable();                            
    var exp = Rule.QueryText;

    var typ = Expression.Parameter(typeof(dataset), "p");
    var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] {typ}, null, exp);
    dataSets.Where((Expression<Func<dataset, bool>>) e).ToList().ForEach(b =>
    {
        *some course of action*
    });  
}

Большинство правил довольно просты 'p.type == \ "3 \" 'или тому подобное.Однако один из них должен выглядеть примерно так:

_listOfBespokeStringsObject.CheckBespokeStringList(p.StringToBeChecked) == true

, где он вызывает метод CheckBespokeStringList локального свойства, чтобы найти совпадение в моем списке строк, производных от базы данных, хотя и со всеми удаленными пробелами.

Я довольно новичок в .net, так что я до сих пор не до конца осознаю ограничения на него!

1 Ответ

0 голосов
/ 19 декабря 2018

Вы должны позволить своему выражению узнать типы, которые вы используете, попытаться определить _aListOfBespokeStringsObject в своем выражении и, возможно, сделать его общедоступным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...