我想创建一个函数,我可以传入一个任意对象并检查它是否具有特定值的特定属性。我试图用反射来做这件事,但反思仍然让我感到困惑。我希望有人能指出我正确的方向。
这是我尝试的代码,但显然它不起作用:
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;
}
}
答案 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)
这里回答这个问题为时已晚。但我正在寻找同样的问题,并以LINQ
和Reflection
更清洁的方式解决了这个问题。所以,如果您对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
如果您想匹配确切的值,那么您可以选择:
Bool Flag = YourObject.GetType().GetProperties().Any(t => t.GetValue(objEmailGUID, null).ToString() == propertyValue);
答案 3 :(得分:0)
您应该查看msdn并阅读有关绑定标志的信息。具体来说: