我正在尝试使用从对象获取属性并检查该属性是否包含特定值:
获取属性的方法如下:
public static object GetProp(object obj, string propName, value)
{
return obj.GetType().GetProperty(propName).GetValue(obj).Contains(value);
}
这将为我带来对象价值。
用法是(或者实际上我想要实现的是):
string value = this._predicateFilter.GetValueOrDefault(refName, string.Empty);
if (!string.IsNullOrEmpty(value))
{
predicate.And(c => Assets.Extensions.GetProp(c, "name", "value to compare"));
}
我遇到了一个例外:
“object”不包含“Contains”的定义,并且最佳扩展方法重载“Queryable.Contains(IQueryable,string)”需要“IQueryable”类型的接收器
我认为问题出在 linq 上,实体框架无法在其主体内执行该方法。
我可以使用讨厌的解决方案,例如:
string firstname = this._predicateFilter.GetValueOrDefault("Firstname", string.Empty);
if (!string.IsNullOrEmpty(firstname))
{
predicate.And(c => c.Firstname.Contains(firstname));
}
string lastname = this._predicateFilter.GetValueOrDefault("Lastname", string.Empty);
if (!string.IsNullOrEmpty(lastname))
{
predicate.And(c => c.Lastname.Contains(lastname));
}
哪个工作正常,但我更喜欢更少的代码 - 我错过了什么?
哦,我正在使用
var predicate = PredicateBuilder.New<Candidate>();
来自 linqKit
Type.GetProperty
不返回属性 value,而是返回该属性本身的 PropertyInfo
。您想要的是获取给定实例的属性值 - 在您的情况下为 obj
。所以在你的 GetProp
方法中使用这个:
return obj.GetType().GetProperty(propName).GetValue(obj);
PropertyInfo.GetValue
返回一个 object
,您尝试将其用作 IQueryable<T>
。
代码准确地告诉您错误是什么
object
不包含 Contains
的(扩展)方法。另外,在更新的代码中,您错过了方法签名中 value
的标识符,并且当您始终返回 object
时,返回类型为 bool
。
因此请修复这些错误,并在调用
Contains
之前将其转换为 IQueryable<T>
:
public static bool GetProp(object obj, string propName, string value)
{
object o = obj.GetType().GetProperty(propName).GetValue(obj);
IQueryable<object> queryable = o as IQueryable<object>;
if (queryable != null)
{
return queryable.Contains(value);
}
return false; //Some other default
}
尝试以下操作:
public static bool PropEquals<TProp>(object obj, string propName, TProp valueToTest)
{
return EqualityComparer<TProp>.Default.
Equals(valueToTest, obj.GetType().GetProperty(propName).GetValue(obj));
}
...
string value = this._predicateFilter.GetValueOrDefault(refName, string.Empty);
if (!string.IsNullOrEmpty(value))
{
predicate.And(c => Assets.Extensions.PropEquals(c, "name", "value to compare"));
}
PropEquals 返回 true 或 false,具体取决于您提供的名称的属性是否等于您提供的值。