【发布时间】:2017-07-07 23:17:11
【问题描述】:
我正在尝试为 IQueryable 创建 WhereLike 扩展,但在运行时我不知道该属性的类型。
这是我的代码:
public static IQueryable WhereLike(this IQueryable source, string propertyName, string pattern)
{
if (source == null) throw new ArgumentNullException("source");
if (propertyName == null) throw new ArgumentNullException("propertyName");
var a = Expression.Parameter(typeof(object), "a");
var prop = Expression.Property(a, propertyName);
return source.Provider.CreateQuery(
Expression.Call(
typeof(SqlMethods), "Like",
null,
prop, Expression.Constant(pattern)));
}
我得到了异常:没有为类型“System.Object”定义实例属性“foo”
你知道在编译时不知道目标类型的情况下处理属性设置的方法吗?
【问题讨论】:
-
SQL like 运算符不是只对字符串起作用吗?
-
@Fran 为什么这很重要?
-
@Servy 因为如果他无法确定属性的类型,他可以尝试在不支持它的属性上使用 WhereLike(DateTime、Double、...)然后他当它发生时会得到一个运行时异常。也许他试图抓住源 ElementType 并使用反射查找属性类型。
-
@Fran 是的,如果提供的属性类型不是字符串,代码将在运行时失败。尝试自己检查并没有真正的帮助,因为它在运行时仍然会失败。这就是拥有完全动态类型代码的本质。值类型中的错误在运行时出现,而不是编译时。
-
@Servy True。我想我正试图尽早捕获错误。并返回一条消息,表明此函数不支持字符串以外的类型。所以我只是启动了 SSMS 来运行一些类似的查询。一些喜欢在日期时间工作,但不是我预期的方式。就像十进制一样不起作用。有趣的是它们不会抛出语法错误,它们只是不返回数据。
标签: c# dynamic-linq