getter/setterのMethodInfoからホスティングPropertyInfoを見つける
-
21-08-2019 - |
質問
Reflectionを使用して実行時に型分析を行います。MethodInfoインスタンスがある場合、これが「実際の」メソッドなのか、それともプロパティのゲッター/セッターメソッドなのかをどのように把握できますか?それがプロパティの場合、そのホストである PropertyInfo を見つけるにはどうすればよいでしょうか?
解決
エクマ335を指定します(しかし要求しない)コンパイラは、get_メソッド/ set_のプレフィックス(チャプター22.28)を使用すること。私はその勧告を破る任意の言語を知りません。簡単にそれを作るます:
public static PropertyInfo GetPropFromMethod(Type t, MethodInfo method) {
if (!method.IsSpecialName) return null;
return t.GetProperty(method.Name.Substring(4),
BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
}
他のヒント
さて、ゲッターとセッターの背後にあるメソッド は 「本物の」メソッド。
プロパティに戻ると、パターン (return と 1 つの引数を取る) が絞り込みに役立ちますが、プロパティを見つけるにはそれぞれで GetGetMethod/GetSetMethod を呼び出す必要があります。
あなたは出来る おそらく 試してみてください Name
(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();
}
}
MethodBase.IsSpecialName
を調べてください。そのようなプロパティアクセサ、イベントサブスクリプションの方法およびオペレータのオーバーロードとしてはっきり見えてはならない方法は、このフラグを使用します。
私の知る限りでは、プロパティを反復処理とメソッドを比較することなくPropertyInfo
を見つける方法がありません。
私は本当にコメントとしてこれを残したいのですが、私は十分に高く、私の担当者ありえないので、カント:(
マルクGravellのコードのバグをtheresの:そのインデクサが、それは親プロパティが存在する場合でも、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);
}
}
と遊ぶトリックがあるの BindingFlags.DeclaredOnly と IsSpecialName の