5

任意のオブジェクトを渡して、特定の値を持つ特定のプロパティがあるかどうかを確認できる関数を作成したいと思います。リフレクションを使用してこれを実行しようとしていますが、リフレクションはまだ少し混乱しています。私は誰かが私を正しい方向に向けることができるかもしれないことを望んでいました。

これが私が試しているコードですが、明らかに機能しません:

    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

4 に答える 4

5

メソッド呼び出しBindingFlagsでさらに指定する必要があります。Type.GetPropertyこれは、|文字と などの他のフラグを使用して行いBindingFlags.Publicます。他の問題は、呼び出しobjからの null パラメーターまたは null の結果をチェックしていません。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同等に比較する必要がありますが、元のサンプルとは異なる動作を示します。

于 2012-10-02T20:13:33.003 に答える
2

ここでこの質問に答えるには遅すぎます。しかし、私は同じ問題を探していて、 and を使用してよりクリーンな方法で解決しまし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

正確な値を一致させたい場合は、次のようにします。

Bool Flag = YourObject.GetType().GetProperties().Any(t => t.GetValue(objEmailGUID, null).ToString() == propertyValue);
于 2013-12-02T07:33:52.473 に答える
1

メンバーを取得するときは、instance/static の指定に加えて、Public/NonPublic を指定する必要があります。

たとえば、パブリック プロパティを取得するには、次を使用します。

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

すべてのプロパティを取得するには、Public と NonPublic の両方を取得する必要があります。

于 2012-10-02T20:13:00.933 に答える
0

msdnを見て、バインディング フラグについて調べてください。具体的には:

Instance または Static を Public または NonPublic と共に指定する必要があります。そうしないと、メンバーが返されません。

于 2012-10-02T20:22:44.330 に答える