Udostępnij za pośrednictwem


Typy ogólne i atrybuty

Atrybuty można stosować do typów ogólnych w taki sam sposób, jak typy niegeneryczne. Można jednak stosować atrybuty tylko dla otwartych typów ogólnych i zamkniętych skonstruowanych typów ogólnych, a nie w częściowo skonstruowanych typach ogólnych. Otwarty typ ogólny jest taki, w którym żaden z argumentów typu nie jest określony, taki jak Dictionary<TKey, TValue> zamknięty skonstruowany typ ogólny określa wszystkie argumenty typu, takie jak Dictionary<string, object>. Częściowo skonstruowany typ ogólny określa niektóre, ale nie wszystkie argumenty typu. Może to być na przykład Dictionary<string, TValue>. Niezwiązany typ ogólny to typ, w którym argumenty typu są pomijane, takie jak Dictionary<,>.

W poniższych przykładach użyto tego atrybutu niestandardowego:

class CustomAttribute : Attribute
{
    public object? info;
}

Atrybut może odwoływać się do niezwiązanego typu ogólnego:

public class GenericClass1<T> { }

[CustomAttribute(info = typeof(GenericClass1<>))]
class ClassA { }

Określ wiele parametrów typu przy użyciu odpowiedniej liczby przecinków. W tym przykładzie GenericClass2 mają dwa parametry typu:

public class GenericClass2<T, U> { }

[CustomAttribute(info = typeof(GenericClass2<,>))]
class ClassB { }

Atrybut może odwoływać się do zamkniętego skonstruowanego typu ogólnego:

public class GenericClass3<T, U, V> { }

[CustomAttribute(info = typeof(GenericClass3<int, double, string>))]
class ClassC { }

Atrybut, który odwołuje się do parametru typu ogólnego, powoduje błąd czasu kompilacji:

[CustomAttribute(info = typeof(GenericClass3<int, T, string>))]  //Error CS0416
class ClassD<T> { }

Począwszy od języka C# 11, typ ogólny może dziedziczyć z Attributeklasy :

public class CustomGenericAttribute<T> : Attribute { }  //Requires C# 11

Aby uzyskać informacje o typie ogólnym lub parametrze typu w czasie wykonywania, można użyć metod System.Reflection. Aby uzyskać więcej informacji, zobacz Ogólne i Odbicie.

Zobacz też