我正在尝试使用对象的get属性并检查该属性是否包含特定值:
获取属性的方法如下:
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' does not contain a definition for 'Contains' and the best
extension method overload 'Queryable.Contains<string>
(IQueryable<string>, string)' requires a receiver of type
'IQueryable<string>'
我认为问题与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));
}
Witch工作得很好但是,我会减少代码,我缺少什么?
哦,我正在使用
var predicate = PredicateBuilder.New<Candidate>();
来自linqKit的
答案 0 :(得分:4)
Type.GetProperty
不返回属性 value ,但该属性本身的PropertyInfo
。您想要的是获取给定实例的属性值 - 在您的情况下为obj
。因此,请在GetProp
方法中使用此方法:
return obj.GetType().GetProperty(propName).GetValue(obj);
答案 1 :(得分:1)
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
}
答案 2 :(得分:0)
尝试以下方法:
<?php
if(isset($_GET['sub'])) {
var_dump($_REQUEST);
die;
}
?>
<form action="index.php?a=12" method="get">
<input name="sub" type="submit" value="Calc">
</form>
PropEquals返回true或false,具体取决于您提供的名称属性是否等于您提供的值。