Type.GetProperty()に対してBindingFlags.IgnoreCaseが機能しない


183

以下を想像してください

タイプTにはフィールドCompanyがあります。次のメソッドを実行すると、完全に機能します。

Type t = typeof(T);
t.GetProperty("Company")

ただし、次の呼び出しはnullになりますが

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

誰かがアイデアを得ましたか?


20
@OregonGhost:それは重要ですか?
leppie 2008年

9
あなたのメタ質問は有効ですが、実際にはそれほど重要ではありません。私のほとんどの質問と同じように、私の主な理由は知識への飢えです;)
Boris Callens

1
@leppie:はい、あります。たぶん私は気づいていないユースケースがあるかもしれません、そしてなぜ人々が物事をやりたいのかはいつも興味深いです。
OregonGhost 2008年

21
@OregonGhost:.Netをターゲットとするすべての言語で大文字と小文字が区別されるわけではないため、実行する必要があり、大文字と小文字を区別しないルックアップが必要になる場合があります。
Pop Catalin

2
使用例:オブジェクトをどのようにフィールドに入力したかを気にすることなく、オブジェクトをMSSQLコンパクトエンティティと比較できます。(オブジェクトを、いくつかのフィールドがisSomethingおよびIsSomethingという名前のコンパクトデータベースと比較しています。)言い換えると、怠惰のためです。
teynon 2013

回答:


389

デフォルトのルックアップフラグを上書きしました。新しいフラグを指定する場合は、プロパティを見つけるためにすべての情報を提供する必要があります。例えば:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
誰もがなぜそれがこのようなものであるかについての知識を持っています(知識を求めて;))
Shrivallabh 2013

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instanceは、プロパティ名のみを指定した場合のデフォルトのフラグです
Otabek Kholikov '17

1
@Shrivallabh OtabekKholikovの説明に加えて、これらのデフォルトを保持BindingFlagsし、指定したものを(OR)に追加する場合、デフォルトを使用しない方法はありません。Publicつまり、Instanceプロパティを除外したり、プロパティを除外したりすることはできません。彼らはあなたがデフォルトを採用するか、あなたが何を求めているかを正確に指定することによってそれらを上書きすることを決めました。
xr280xr

36

追加する必要があります BindingFlags.Public | BindingFlags.Instance


2
賛成票は少なくなりますが、2分の速さでしたが、再び、Popの回答の詳細がわかりました。私はふさわしいすべての人に投票します!:)
トニーバサロ2018

10

おかげで、これは本当のピンチに本当に役立ちました。監査情報を保存しましたが、プロパティ名の大文字と小文字が正しくありません。(監査はデータレイヤーに組み込まれています。)とにかく、IgnoreCaseをバインディングフラグとして追加する必要がありましたが、同僚がこの答えを見つけるまでは機能しませんでした。結果の関数:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}

これは私がDotMagicと呼ぶクラスの一部です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.