Не получается Intellisense для лямбда-выражения - PullRequest
1 голос
/ 29 марта 2011

По сути, я создал вспомогательный метод для объекта проверки, который я использую.Код выглядит так:

public class ValidationSet<TSource> : ValidationSet
{
    public void AddValidationErrorFor<TProperty>(Expression<Func<TSource, TProperty>> propertyLambda, string errorMessage, string data = null)
    {
        // extension method
        PropertyInfo property = propertyLambda.GetPropertyInfo();

        Add(new ValidationItem
        {
            Key = property.Name,
            Message = errorMessage,
            DataMessage = data
        });
    }
}

public class ValidationSet : List<ValidationItem>
{
    public void AddValidationError(string key, string errorMessage)
    {
        Add(new ValidationItem
        {
            Key = key,
            Message = errorMessage
        });
    }
}

По сути, что происходит (и это работает), так это то, что я могу написать что-то вроде этого:

public class SomeObject
{
     public int Id { get; set; }
     public string SomeValue { get; set; }
}

А потом, когда я хочу проверитьэто, я могу написать что-то вроде этого:

ValidationSet<SomeObject> validationSet = new ValidationSet<SomeObject>();

if(SomeValue.Contains("SomeOtherValue"))
    validationSet.AddValidatorErrorFor(x => x.SomeValue, "Some Error");

Это все в настоящее время компилируется.Тем не менее, я не получаю intellisense для моего лямбда-выражения в последней строке.Я должен вручную набрать x.SomeValue, хотя все это прекрасно компилируется.Кто-нибудь знает, чего не хватает, чтобы получить intellisense?

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Я воспроизвел вашу настройку так ...

public class ValidateThing<TSource>
{
    public void AddValidation<TProperty>(Expression<Func<TSource, TProperty>> expr)
    {
        //...
    }
}

public static class Tester
{
    public static void Test()
    {
        ValidateThing<string> v = new ValidateThing<string>();

        v.AddValidation(s => s.Length);
    }
}

Как только я набрал s. после s =>, я получил intellisense для членов String.Этот фрагмент кода работает так же, как ваш код?

EDIT : О, я полагаю, уместно спросить, какую версию Visual Studio вы используете.

1 голос
/ 14 сентября 2016

@ Tejs Вы меня правильно выбрали.Хотя у меня не было параметра Nullable, у меня были некоторые дополнительные параметры.Два из них, чтобы быть точным.Я удалил их, а затем IntelliSense сработал.

Поэтому я отложил их и создал перегруженную версию расширения без дополнительных параметров, и она все еще работала.

В качестве другого теста я прокомментировал расширениеу этого был только один параметр, и проверенный IntelliSense все еще работал.Затем я добавил второй параметр в расширение, в котором был только один параметр, и IntelliSense перестал работать.

Поэтому, по крайней мере, в моем случае мне нужна была версия, в которой был только 1 параметр.

Надеюсь, это поможет кому-то еще.

О, и я использую VS 2015.

1 голос
/ 29 марта 2011

IntelliSense в IDE не имеет паритета 1-1 с кодом, который компилируется. Он должен связывать выражения на основе частично типизированных структур и, следовательно, неполной информации. Это не всегда возможно сделать.

Одной из областей, которая особенно трудна, является вывод IDE лямбда-выражений (особенно деревьев выражений). Это скорее всего случай, когда IDE плохо обрабатывает intellisense

...