Лямбда Func <> и Быстрый

Если Вы действительно хотите, чтобы Ваше рекурсивное удаление каталога выполнило символьные ссылки, то я не думаю, что существует любой независимый от платформы способ сделать так, не отслеживая все каталоги, которые Вы пересекли.

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

, Если это - поведение, Вы хотите затем, можно использовать метод FileUtils.deleteDirectory в Apache палата общин IO.

7
задан ctorx 21 August 2009 в 03:13
поделиться

2 ответа

Ключ к плавным интерфейсам заключается в том, что такие методы, как CannotBeNull () и CannotBeBlank (), возвращают текущий экземпляр (то есть this). Если вы хотите, чтобы ваш метод AddRule работал «свободно», вместо того, чтобы возвращать ValidationResult, вам необходимо вернуть текущий экземпляр IValidator. Ваши методы расширения также должны будут возвращать экземпляр IValidator, который они расширяют.

Я думаю, что ваша точная реализация может быть немного более сложной, и, надеюсь, приведенный ниже пример даст некоторое представление. То же самое общее правило, однако ... верните "this" для создания свободного интерфейса:

interface IValidator<T>
{
    IValidatorRule<T, TProp> AddRule<TProp>(Func<T, TProp> property);
}

interface IValidatorRule<T>
{
    T instance { get; }
    string PropertyName { get; }

    ValidationResult Apply(T instance);
}

public static IValidatorAugmentorExtensions
{
    public static IValidatorRule<T> CannotBeNull(this IValidatorRule<T> rule)
    {
        // ...

        return rule;
    }

    public static IValidatorRule<T> CannotBeBlank(this IValidatorRule<T> rule)
    {
        // ...

        return rule;
    }
}

Вышеупомянутое можно использовать так:

public class PersonValidator: IValidator<Person>
{
    public PersonValidator()
    {
        AddRule(p => p.FirstName).CannotBeNull().CannotBeEmpty();
        AddRule(p => p.LastName).CannotBeNull().CannotBeEmpty();
    }    

    public List<ValidationResult> Validate(Person p)
    {
        List<ValidationResult> results = new List<ValidationResult>();

        foreach (IValidatorRule<Person> rule in rules) // don't know where rules is, or what the AddRule method adds to...you'll need to figure that out
        {
            results = rule.Apply(p);
        }

        return results;
    }
}

Хотя выше показано, как создать свободный интерфейс, я действительно не знаю, что это выгодно вам в долгосрочной перспективе в данной конкретной ситуации. Для удобства плавного интерфейса, который, кажется, используется только внутри конкретных валидаторов, вы значительно увеличили сложность своего кода, не предоставляя на самом деле полезного и понятного интерфейса для потребителей ваших валидаторов. Я думаю, вы получите больше пользы, предоставив разработчикам, которым необходимо выполнять валидацию, гибкую структуру валидации, а не предоставив плавную структуру для создания конкретных валидаторов.

5
ответ дан 7 December 2019 в 10:05
поделиться

Джриста ответ правильный. Для другого подхода, вот как я это сделал.

public class PersonValidator : IValidator<Person>
    {
        List<Func<Person,bool>> validationRules = new List<Func<Person,bool>>();

    public PersonValidator()
    {
        AddRule( p => IsNullOrEmpty(p.FirstName)).AddRule(p1 => CheckLength(p1.FirstName));
    }

    PersonValidator AddRule(Func<Person,bool> rule)
    {
        this.validationRules.Add(rule);
        return this;
    }

    private bool IsNullOrEmpty(String stringToCheck)
    {
        return String.IsNullOrEmpty(stringToCheck);
    }

    private bool CheckLength(String stringToCheck)
    {
        return (String.IsNullOrEmpty(stringToCheck) ? false : stringToCheck.Length < 3);
    }

    #region IValidator<Person> Members

    public bool Validate(Person obj)
    {
        return validationRules.Select(x => x(obj)).All(result => result == false);
    }

    #endregion
}



        Person test = new Person() { FirstName = null };
        Person test1 = new Person() { FirstName = "St" };
        Person valid = new Person() { FirstName = "John" };

        PersonValidator validator = new PersonValidator();
        Console.WriteLine("{0} {1} {2}", validator.Validate(test), validator.Validate(test1), validator.Validate(valid));
1
ответ дан 7 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: