如何搜索对象是否具有值为C#的属性

时间:2012-10-02 20:07:40

标签: c# reflection

我想创建一个函数,我可以传入一个任意对象并检查它是否具有特定值的特定属性。我试图用反射来做这件事,但反思仍然让我感到困惑。我希望有人能指出我正确的方向。

这是我尝试的代码,但显然它不起作用:

    public static bool PropertyHasValue(object obj, string propertyName, string propertyValue)
{
    try
    {
        if(obj.GetType().GetProperty(propertyName,BindingFlags.Instance).GetValue(obj, null).ToString() == propertyValue)
        {
            Debug.Log (obj.GetType().FullName + "Has the Value" + propertyValue);
            return true;    
        }

        Debug.Log ("No property with this value");
        return false;
    }
    catch
    {
        Debug.Log ("This object doesnt have this property");
        return false;
    }

}

4 个答案:

答案 0 :(得分:1)

检索成员时,除了指定实例/静态外,还必须指定Public / NonPublic:

例如,要检索您将使用的公共属性:

GetProperty(propertyName,BindingFlags.Instance | BindingFlags.Public)

要检索所有属性,您必须同时检索Public和NonPublic。

答案 1 :(得分:1)

您需要在BindingFlags方法调用中指定更多Type.GetProperty。您可以使用|字符和其他标志执行此操作,例如BindingFlags.Public。其他问题不是检查obj调用中的空PropertyInfo.GetValue参数或空结果。

为了在您的方法中更明确,您可以像这样写下来并在您认为合适的地方折叠。

public static bool PropertyHasValue(object obj, string propertyName, string propertyValue)
{
    try
    {
        if(obj != null)
        {
            PropertyInfo prop = obj.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);
            if(prop != null)
            {
                object val = prop.GetValue(obj,null);
                string sVal = Convert.ToString(val);
                if(sVal == propertyValue)
                {
                    Debug.Log (obj.GetType().FullName + "Has the Value" + propertyValue);
                    return true;    
                }
            }
        }

        Debug.Log ("No property with this value");
        return false;
    }
    catch
    {
        Debug.Log ("An error occurred.");
        return false;
    }
}

在我看来,您应该接受propertyValue作为object并平等地比较对象,但这会表现出与原始样本不同的行为。

答案 2 :(得分:1)

这里回答这个问题为时已晚。但我正在寻找同样的问题,并以LINQReflection更清洁的方式解决了这个问题。所以,如果您对LINQ开放。你可以这样得到它。

String propertyValue = "Value_to_be_compared";

Bool Flag = YourObject.GetType().GetProperties().Any(t => t.GetValue(objEmailGUID, null).ToString().Contains(propertyValue));

if(Flag)
{
  //spread love if true
}

代码会检查您是否对Value_to_be_compared

对象的任何属性Contains

如果您想匹配确切的值,那么您可以选择:

Bool Flag = YourObject.GetType().GetProperties().Any(t => t.GetValue(objEmailGUID, null).ToString() == propertyValue);

答案 3 :(得分:0)

您应该查看msdn并阅读有关绑定标志的信息。具体来说:

您必须与Public或NonPublic一起指定Instance或Static,否则将不返回任何成员。