基本上,我为我正在使用的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
,即使它都编译好了。有谁知道获得智能感知缺少什么?
答案 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。