3

私はクラスにパブリックプロパティを持っていますが、次のフラグが与えられたときに無視されるようにそれ(いくつかの属性)をどのようにマークする必要がありますか

BindingFlags.DeclaredOnly | 
BindingFlags.Instance | 
BindingFlags.NonPublic | 
BindingFlags.Public

パラメータを使用してdllのメソッドを使用する必要があります:オブジェクトとバインディングフラグなので、このメソッドで無視されるようにプロパティをマークする必要があります

4

5 に答える 5

3

BindingFlagsとCustomAttributesの役割を混同していると思います。BindingFlagsは、、などに基づいて物事を検索しprivateますstatic

消費コードのプロパティを無視する場合は、特定のカスタム属性が関連付けられているプロパティを無視するように、その消費コードを変更する必要があります。

消費するコードにアクセスできない場合、そこにあるプロパティが表示されないようにする方法はありません。ただし、コードの記述方法によっては、いくつかの回避策がある場合があります。たとえば、コードが特定の型の引数に基づいて検索している場合は、関心のあるすべてのプロパティを格納する抽象基本クラスを作成し、そのクラスを実際の実装用に拡張して、いくつかのプロパティを追加できます。快適。

または、呼び出しているメソッドに伝達するプロパティのみを表すDTOを作成し、元のオブジェクトからそのDTOに適切なプロパティをコピーすることもできます。

于 2012-04-12T20:23:10.110 に答える
0

フラグは静的プロパティを返しません。

class Foo
{
  public static int Bar { get; set; }
}

編集あなたはあなたが行動を変えたくないと述べました。あなたのdllはオブジェクトまたはタイプを取りますか?タイプの場合、継承を使用して、このメソッドからプロパティを「非表示」にすることができます。

あなたが今持っていると言う:

class Foo
{
  public int X {get;set;}
  public int Y {get;set;}
}

そして、あなたのコードはとを期待FooしていXますY。あなたのdll/ユーティリティがタイプを取る場合、私たちはFoo派生を作ることができますBar。ユーティリティに「X」を表示させたくないが、「Y」のみを表示させたいとしましょう。

class Bar
{
  public int Y {get;set;}
}

class Foo : Bar
{
  public int X {get;set;}
}

//ユーティリティ呼び出しで

utility.Baz(foo.GetType().BaseType); // <- Base here is Bar, which does not have X
于 2012-04-12T20:23:14.140 に答える
0

呼び出し中にそれを無視する唯一の方法はを使用することType.FindMembersですが、それはおそらくそれを単にポストフィルタリングするよりも多くの作業を必要とします。

于 2012-04-12T20:23:50.427 に答える
0

ここではカスタム属性が適切だと思います。無視するメンバーを属性で装飾し、装飾されたアイテムを取り除くルーチンでプロパティを検査するために使用しているコードをラップします。

于 2012-04-12T20:28:01.657 に答える
0

これは、単純な拡張メソッドで実行できます。

public static class ExtensionMethods
{
    public static PropertyInfo[] GetNonPublicProperties(this Type t) {
        return t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Where(prop => prop.GetAccessors(true).Where(mi => mi.IsPublic == false).Count() != 0).ToArray();
    }
}

次に、使用するだけType.GetNonPublicPropertiesで設定が完了します。

于 2012-04-12T20:37:26.377 に答える