从对象获取属性并检查它是否包含值

时间:2017-01-19 09:21:55

标签: c# entity-framework linq

我正在尝试使用对象的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的

3 个答案:

答案 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,具体取决于您提供的名称属性是否等于您提供的值。