2017-07-07 38 views
2

に過負荷をかけ、私はクラスのMemberInfoのパッケージするSystem.Reflectionで同じシグネチャが異なる戻り値の型を持つ2つの方法(1つのクラスメソッドと1拡張メソッド)がある気づい:MemberInfo.GetCustomAttributes拡張子が

クラスメソッド:

CustomAttributeExtensions内側)
public abstract object[] GetCustomAttributes(Type attributeType, bool inherit) 

拡張メソッド

私はそのようなパラメータでこのメソッドを呼び出すと、常にクラスメソッドが呼び出されることを知っているので、私は不思議に思っています。

拡張メソッドを呼び出す方法は?

そして、とりわけ、クラスメソッドと同じシグネチャで拡張を定義する目的は何ですか?

+3

静的メソッドのように呼び出すことができます。 'CustomAttributeExtensions.GetCustomAttributes(element、attribute、inherit); ' – NtFreX

+0

この' CustomAttributeExtensions'クラスはどこですか? –

+0

これは参照用です。https://msdn.microsoft.com/en-us/library/hh138301(v=vs.110).aspx – Andrea

答えて

6

フレームワークでこのような重複を持つことは、まさに機能ではありません。しかし、これはロックであり、難しいところでした。彼らは.NET 4.5に拡張メソッドを追加しなければなりませんでした。バージョン情報ブロックのMSDN記事の一番下に表示されます。拡張メソッドはUWPとPhoneプロジェクトで使用できますが、従来の方法は使用できません。

基本的な理由は、の言語投影が4.5のCLRに組み込まれているためです。 WinRTタイプとCLRタイプの間には大きな違いはありません。 WinRTはまだ生まれていないだろう、もしプログラマーが実際にUWPの能力を発揮していることをプログラマーが知っていれば、それは非常に隠れているだろうが、TypeクラスはCLRと結婚しすぎていた。代わりにTypeInfoクラスを提供してください。そして、APIのギャップを埋めるための拡張メソッド。

UWPをターゲットにしていない場合は、拡張メソッドにあまり使われていないため、従来の方法を優先する必要があります。拡張方法is about 30% slower

2

実際には、同じセットのパラメータで、MemberInfo.GetCustomAttributesCustomAttributeExtensions.GetCustomAttributesが有効です。

それぞれのリファレンスソースを見ると、拡張メソッドが実際にAttribute.GetCustomAttributeに委譲されていることがわかります。そしてその方法は最終的にMemberInfo.GetCustomAttributesに戻ります。

これらの2つの機能には違いがありますか?いいえ、実際はありません。そして、この拡張メソッドが存在する理由は何ですか?私は残念ながら手がかりがありません。 CustomAttributeExtensionsの主な利点は、とにかく型付きの属性を取得できる一般的なオーバーロードなので、実際には通常の状況でGetCustomAttributesを使用するとは思わないと思います。