没有获得Lambda Expression的Intellisense

时间:2011-03-29 15:58:31

标签: c# asp.net-mvc visual-studio lambda intellisense

基本上,我为我正在使用的Validation对象创建了一个辅助方法。代码是这样的:

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

这一切目前都在编译。但是,我没有在最后一行得到我的lambda表达式的intellisense。我必须手动输入x.SomeValue,即使它都编译好了。有谁知道获得智能感知缺少什么?

3 个答案:

答案 0 :(得分:2)

我像这样重现你的设置......

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 =>时,我就为String的成员提供了智能感知功能。此代码段是否与您的代码产生相同的行为?

编辑:哦,我想问一下你正在使用的Visual Studio版本是否相关。

答案 1 :(得分:1)

IDE中的IntelliSense与编译的代码没有1-1奇偶校验。它必须基于部分类型的结构绑定表达式,因此不完整的信息。这并不总是可行的。

一个特别困难的领域是lambda表达式(特别是表达式树)的IDE推断。这可能只是IDE无法很好地处理intellisense

的情况

答案 2 :(得分:1)

@Tejs你让我走上正轨。虽然我没有可以为空的参数,但我确实有一些额外的参数。其中两个准确。我删除了它们,然后IntelliSense工作。

所以我把它们放回来并创建了一个没有额外参数的扩展的重载版本,它仍然有效。

作为另一项测试,我评论了只有一个参数的扩展,并且经过验证的IntelliSense仍然有效。然后,我向扩展中添加了第二个参数,该参数只有一个参数,并且IntelliSense停止工作。

所以至少在我的情况下,我需要一个只有1个参数的版本。

希望这有助于其他人。

哦,我正在使用VS 2015。