CustomReflectionContext クラス

定義

カスタマイズ可能なリフレクション コンテキストを表します。

public ref class CustomReflectionContext abstract : System::Reflection::ReflectionContext
public abstract class CustomReflectionContext : System.Reflection.ReflectionContext
type CustomReflectionContext = class
    inherit ReflectionContext
Public MustInherit Class CustomReflectionContext
Inherits ReflectionContext
継承
CustomReflectionContext
派生

次の例では、名前が "To" で始まる特定の型のすべてのメンバーにカスタム属性を追加する方法 CustomReflectionContext を示します。 このコードを実行するには、空のコンソール プロジェクトに貼り付け、System.Reflection.Context.dllへの参照を含めるようにします。

//A blank example attribute.
class myAttribute : Attribute
{
}

//Reflection context with custom rules.
class myCRC : CustomReflectionContext
{
    //Called whenever the reflection context checks for custom attributes.
           protected override IEnumerable<object> GetCustomAttributes(MemberInfo member, IEnumerable<object> declaredAttributes)
           {
               //Add example attribute to "To*" members.
               if (member.Name.StartsWith("To")) {
                   yield return new myAttribute();
               }
               //Keep existing attributes as well.
               foreach (var attr in declaredAttributes) yield return attr;
         }
}

class Program
{
    static void Main(string[] args)
    {
        myCRC mc = new myCRC();
        Type t = typeof(String);

        //A representation of the type in the default reflection context.
        TypeInfo ti = t.GetTypeInfo();

        //A representation of the type in the customized reflection context.
        TypeInfo myTI = mc.MapType(ti);

        //Display all the members of the type and their attributes.
        foreach (MemberInfo m in myTI.DeclaredMembers)
        {
           Console.WriteLine(m.Name + ":");
           foreach (Attribute cd in m.GetCustomAttributes())
           {
                Console.WriteLine(cd.GetType());
           }
        }

        Console.WriteLine();

        //The "ToString" member as represented in the default reflection context.
        MemberInfo mi1 = ti.GetDeclaredMethods("ToString").FirstOrDefault();

        //All the attributes of "ToString" in the default reflection context.
        Console.WriteLine("'ToString' Attributes in Default Reflection Context:");
        foreach (Attribute cd in mi1.GetCustomAttributes())
        {
            Console.WriteLine(cd.GetType());
        }

        Console.WriteLine();

        //The same member in the custom reflection context.
        mi1 = myTI.GetDeclaredMethods("ToString").FirstOrDefault();

        //All its attributes, for comparison.  myAttribute is now included.
        Console.WriteLine("'ToString' Attributes in Custom Reflection Context:");
        foreach (Attribute cd in mi1.GetCustomAttributes())
        {
            Console.WriteLine(cd.GetType());
        }

        Console.ReadLine();
    }
}

注釈

CustomReflectionContext では、完全なリフレクション モデルを再実装することなく、リフレクション オブジェクトからカスタム属性を追加または削除したり、それらのオブジェクトにダミー プロパティを追加したりできます。 既定値 CustomReflectionContext は、変更を加えずにリフレクション オブジェクトをラップするだけですが、関連するメソッドをサブクラス化してオーバーライドすることで、反映されたパラメーターまたはメンバーに適用される属性を追加、削除、または変更したり、反映された型に新しいプロパティを追加したりできます。

たとえば、コードがファクトリ メソッドに特定の属性を適用する規則に従っているのに、属性がないサードパーティのコードを操作する必要があるとします。 属性を持つ必要があるオブジェクトを識別するための規則を指定し、コードから表示するときにそれらの属性をオブジェクトに提供するために使用 CustomReflectionContext できます。

効果的に使用 CustomReflectionContext するには、反映されたオブジェクトを使用するコードは、すべてのリフレクション オブジェクトがランタイム リフレクション コンテキストに関連付けられていると想定するのではなく、リフレクション コンテキストを指定するという概念をサポートする必要があります。 .NET Frameworkの多くのリフレクション メソッドは、この目的のためにパラメーターをReflectionContext提供します。

反映されたパラメーターまたはメンバーに適用される属性を変更するには、またはGetCustomAttributes(MemberInfo, IEnumerable<Object>)メソッドをオーバーライドしますGetCustomAttributes(ParameterInfo, IEnumerable<Object>)。 これらのメソッドは、反映されたオブジェクトとその現在のリフレクション コンテキストの属性の一覧を取得し、カスタム リフレクション コンテキストの下に含める必要がある属性の一覧を返します。

警告

CustomReflectionContextメソッドは、指定MemberInfoされたまたはインスタンスでメソッドを呼び出GetCustomAttributesすことによって、反映されたオブジェクトまたはParameterInfoメソッドの属性の一覧に直接アクセスしないようにする必要がありますが、代わりに、メソッド オーバーロードにパラメーターとして渡されるリストを使用declaredAttributesするGetCustomAttributes必要があります。

反映された型にプロパティを追加するには、メソッドをオーバーライドします AddProperties 。 このメソッドは、反映された型を指定するパラメーターを受け取り、追加のプロパティの一覧を返します。 このメソッドを CreateProperty 使用して、返すプロパティ オブジェクトを作成する必要があります。 プロパティ アクセサーとして機能するプロパティを作成するときにデリゲートを指定できます。また、いずれかのアクセサーを省略して、読み取り専用または書き込み専用のプロパティを作成できます。 このようなダミー プロパティには、メタデータや共通中間言語 (CIL) のバッキングがないことに注意してください。

警告

オブジェクトは複数のコンテキストで同じ反射オブジェクトを表す可能性があるため、リフレクション コンテキストを使用する場合は、反映されたオブジェクト間の等価性に注意してください。 このメソッドを MapType 使用して、特定のリフレクション コンテキストのバージョンのリフレクション オブジェクトを取得できます。

警告

オブジェクトは CustomReflectionContext 、メソッドによって取得されたものなど、特定のリフレクション オブジェクトによって返される属性を GetCustomAttributes 変更します。 メソッドによって GetCustomAttributesData 返されるカスタム属性データは変更されず、カスタム リフレクション コンテキストを使用する場合、これら 2 つのリストは一致しません。

コンストラクター

CustomReflectionContext()

CustomReflectionContext クラスの新しいインスタンスを初期化します。

CustomReflectionContext(ReflectionContext)

指定したリフレクション コンテキストを使用して、CustomReflectionContext クラスの新しいインスタンスをベースとして初期化します。

メソッド

AddProperties(Type)

派生クラスでオーバーライドされると、このリフレクション コンテキストで表されるように、指定された型の追加のプロパティのコレクションを提供します。

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>)

AddProperties(Type) メソッドで使用される、型に追加するプロパティを表すオブジェクトを作成します。

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>)

AddProperties(Type) メソッドで使用される、指定したカスタム属性を使用して、型に追加するプロパティを表すオブジェクトを作成します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

派生クラスでオーバーライドされると、このリフレクション コンテキストで表されるように、指定されたメンバーのカスタム属性の一覧を提供します。

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

派生クラスでオーバーライドされると、このリフレクション コンテキストで表されるように、指定されたパラメーターのカスタム属性の一覧を提供します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
GetTypeForObject(Object)

このリフレクション コンテキスト内の指定されたオブジェクトの型の表現を取得します。

(継承元 ReflectionContext)
MapAssembly(Assembly)

このリフレクション コンテキストで、別のリフレクション コンテキストからのオブジェクトによって表されるアセンブリの表現を取得します。

MapType(TypeInfo)

このリフレクション コンテキストで、別のリフレクション コンテキストからのオブジェクトによって表される型の表現を取得します。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象