[.net] getter / setterのMethodInfoからホスティングPropertyInfoを検索する


Answers

さて、ゲッターとセッターの背後にあるメソッド "本当の"メソッドです。

パターンを返すことでパターンを絞り込むことができますが、GetGetMethod / GetSetMethodを呼び出してプロパティを見つける必要があります。

あなたはおそらく Name (less get __ / set__)を試すことができますが、それは脆いと感じます。 ここに長いバージョンがあります( Nameの使用はありません):

static PropertyInfo GetProperty(MethodInfo method)
{
    bool takesArg = method.GetParameters().Length == 1;
    bool hasReturn = method.ReturnType != typeof(void);
    if (takesArg == hasReturn) return null;
    if (takesArg)
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetSetMethod() == method).FirstOrDefault();
    }
    else
    {
        return method.DeclaringType.GetProperties()
            .Where(prop => prop.GetGetMethod() == method).FirstOrDefault();
    }
}
Question

Reflectionを使用して、実行時にいくつかの型分析を行います。 MethodInfoインスタンスがある場合、これが「本当の」メソッドか、プロパティのgetter / setterメソッドかどうかをどのように把握できますか? それがプロパティの場合は、そのPropertyInfoのホスティングをどのように見つけることができますか?




私は本当にこれをコメントとして残したいと思いますが、私の担当者が十分に高いわけではないので、私は傾けることができます:(

Marc Gravellのコードにバグがあります。インデックスが存在する場合、親プロパティが存在する場合でもnullを返します。 そのクイックフェイルを持っているのはいいですが、戻り値もパラメータもない場合にのみ行うことができます:

    [Pure]
    public static PropertyInfo GetParentProperty(this MethodInfo method)
    {
        if (method == null) throw new ArgumentNullException("method");
        var takesArg = method.GetParameters().Length == 1;
        var hasReturn = method.ReturnType != typeof(void);
        if (!(takesArg || hasReturn)) return null;

        if (takesArg && !hasReturn)
        {
            return method.DeclaringType.GetProperties().FirstOrDefault(prop => prop.GetSetMethod() == method);
        }
        else
        {
            return method.DeclaringType.GetProperties().FirstOrDefault(prop => prop.GetGetMethod() == method);
        }
    }