CustomReflectionContext Kelas

Definisi

Mewakili konteks pantulan yang dapat disesuaikan.

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
Warisan
CustomReflectionContext
Turunan

Keterangan

CustomReflectionContext menyediakan cara bagi Anda untuk menambahkan atau menghapus atribut kustom dari objek refleksi, atau menambahkan properti dummy ke objek tersebut, tanpa menerapkan kembali model pantulan lengkap. Secara default, CustomReflectionContext hanya membungkus objek refleksi tanpa membuat perubahan apa pun, tetapi dengan membuat subkelas dan mengganti metode yang relevan, Anda dapat menambahkan, menghapus, atau mengubah atribut yang berlaku untuk parameter atau anggota yang direfleksikan, atau menambahkan properti baru ke tipe yang direfleksikan.

Misalnya, kode Anda mengikuti konvensi penerapan atribut tertentu ke metode pabrik, tetapi Anda sekarang diharuskan untuk bekerja dengan kode pihak ketiga yang tidak memiliki atribut. Anda dapat menggunakan CustomReflectionContext untuk menentukan aturan untuk mengidentifikasi objek yang harus memiliki atribut dan untuk menyediakan objek dengan atribut tersebut saat dilihat dari kode Anda.

Untuk menggunakan CustomReflectionContext secara efektif, kode yang menggunakan objek yang direfleksikan harus mendukung gagasan menentukan konteks pantulan, alih-alih mengasumsikan bahwa semua objek yang tercermin dikaitkan dengan konteks pantulan runtime. Banyak metode refleksi dalam .NET menyediakan ReflectionContext parameter untuk tujuan ini.

Untuk mengubah atribut yang diterapkan ke parameter atau anggota yang direfleksikan, meng-override metode GetCustomAttributes(ParameterInfo, IEnumerable<Object>) atau GetCustomAttributes(MemberInfo, IEnumerable<Object>). Metode ini mengambil objek yang tercermin dan daftar atribut di bawah konteks pantulannya saat ini, dan mengembalikan daftar atribut yang harus dimilikinya di bawah konteks refleksi kustom.

Warning

CustomReflectionContextmengambil alih tidak boleh mengkueri atribut pada yang disediakan MemberInfo atau dengan memanggil ParameterInfo; gunakan urutan yang GetCustomAttributesdeclaredAttributes diteruskan ke kelebihan beban GetCustomAttributes sebagai gantinya.

Untuk menambahkan properti ke jenis yang direfleksikan, timpa metode AddProperties. Metode menerima parameter yang menentukan jenis yang tercermin, dan mengembalikan daftar properti tambahan. Anda harus menggunakan metode CreateProperty untuk membuat objek properti untuk dikembalikan. Anda dapat menentukan delegasi saat membuat properti yang berfungsi sebagai aksesor properti, dan Anda dapat menghilangkan salah satu aksesor untuk membuat properti baca-saja atau tulis-saja. Perhatikan bahwa properti dummy tersebut tidak memiliki metadata atau dukungan Common Intermediate Language (CIL).

Warning

  • Berhati-hatilah dengan kesetaraan di antara objek yang tercermin saat Anda bekerja dengan konteks refleksi, karena objek mungkin mewakili objek yang tercermin yang sama dalam beberapa konteks. Anda dapat menggunakan MapType metode untuk mendapatkan versi konteks pantulan tertentu dari objek yang tercermin.
  • Objek CustomReflectionContext mengubah atribut yang dikembalikan oleh objek pantulan tertentu, seperti yang diperoleh dengan GetCustomAttributes metode . Ini tidak mengubah data atribut kustom yang dikembalikan oleh GetCustomAttributesData metode , dan kedua daftar ini tidak akan cocok saat Anda menggunakan konteks pantulan kustom.

Contoh berikut memperlihatkan cara subclass CustomReflectionContext untuk menambahkan atribut kustom ke semua anggota dari jenis tertentu yang nama anggotanya dimulai dengan "To".

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

// Reflection context with custom rules.
class MyCustomReflectionContext : 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", StringComparison.Ordinal))
        {
            yield return new MyAttribute();
        }
        // Keep existing attributes as well.
        foreach (object attr in declaredAttributes)
        {
            yield return attr;
        }
    }
}
MyCustomReflectionContext mc = new();
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 affected members of the type ("To*") and their attributes.
foreach (MemberInfo m in myTI.DeclaredMembers.Where(static m => m.Name.StartsWith("To", StringComparison.Ordinal)))
{
    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();

Attribute[] defaultAttributes = mi1.GetCustomAttributes().ToArray();

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

Console.WriteLine();

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

Attribute[] customAttributes = mi1.GetCustomAttributes().ToArray();

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

Konstruktor

Nama Deskripsi
CustomReflectionContext()

Menginisialisasi instans baru dari kelas CustomReflectionContext.

CustomReflectionContext(ReflectionContext)

Menginisialisasi instans CustomReflectionContext baru kelas dengan konteks refleksi yang ditentukan sebagai basis.

Metode

Nama Deskripsi
AddProperties(Type)

Saat ditimpa dalam kelas turunan, menyediakan kumpulan properti tambahan untuk jenis yang ditentukan, seperti yang diwakili dalam konteks pantulan ini.

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

Membuat objek yang mewakili properti yang akan ditambahkan ke jenis, untuk digunakan dengan AddProperties(Type) metode dan menggunakan atribut kustom yang ditentukan.

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

Membuat objek yang mewakili properti yang akan ditambahkan ke jenis, untuk digunakan dengan AddProperties(Type) metode .

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

Saat ditimpa dalam kelas turunan, berikan daftar atribut kustom untuk anggota yang ditentukan, seperti yang diwakili dalam konteks refleksi ini.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

Saat ditimpa dalam kelas turunan, berikan daftar atribut kustom untuk parameter yang ditentukan, seperti yang diwakili dalam konteks refleksi ini.

GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
GetTypeForObject(Object)

Mendapatkan representasi jenis objek yang ditentukan dalam konteks refleksi ini.

(Diperoleh dari ReflectionContext)
MapAssembly(Assembly)

Mendapatkan representasi, dalam konteks refleksi ini, dari rakitan yang diwakili oleh objek dari konteks refleksi lain.

MapType(TypeInfo)

Mendapatkan representasi, dalam konteks refleksi ini, dari jenis yang diwakili oleh objek dari konteks pantulan lain.

MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk