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

问题描述 投票:0回答:3

我正在尝试使用从对象获取属性并检查该属性是否包含特定值:

获取属性的方法如下:

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

c# entity-framework linq
3个回答
4
投票

Type.GetProperty
不返回属性 value,而是返回该属性本身的
PropertyInfo
。您想要的是获取给定实例的属性值 - 在您的情况下为
obj
。所以在你的
GetProp
方法中使用这个:

return obj.GetType().GetProperty(propName).GetValue(obj);

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
}

0
投票

尝试以下操作:

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

© www.soinside.com 2019 - 2024. All rights reserved.