GenericParameterAttributes Enumeration
Microsoft Silverlight will reach end of support after October 2021. Learn more.
Describes the constraints on a generic type parameter of a generic type or method.
This enumeration has a FlagsAttribute attribute that allows a bitwise combination of its member values.
Namespace: System.Reflection
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<FlagsAttribute> _
Public Enumeration GenericParameterAttributes
[FlagsAttribute]
public enum GenericParameterAttributes
Members
Member name | Description | |
---|---|---|
None | There are no special flags. | |
VarianceMask | Selects the combination of all variance flags. This value is the result of using logical OR to combine the following flags: Contravariant and Covariant. | |
Covariant | The generic type parameter is covariant. A covariant type parameter can appear as the result type of a method, the type of a read-only field, a declared base type, or an implemented interface. | |
Contravariant | The generic type parameter is contravariant. A contravariant type parameter can appear as a parameter type in method signatures. | |
SpecialConstraintMask | Selects the combination of all special constraint flags. This value is the result of using logical OR to combine the following flags: DefaultConstructorConstraint, ReferenceTypeConstraint, and NotNullableValueTypeConstraint. | |
ReferenceTypeConstraint | A type can be substituted for the generic type parameter only if it is a reference type. | |
NotNullableValueTypeConstraint | A type can be substituted for the generic type parameter only if it is a value type and is not nullable. | |
DefaultConstructorConstraint | A type can be substituted for the generic type parameter only if it has a parameterless constructor. |
Remarks
The members of the GenericParameterAttributes enumeration are divided into two groups, the variance group and the special constraints group. To test a GenericParameterAttributes value for variance flags, first perform a bitwise AND operation with VarianceMask. If the result is None, there are no variance flags. Similarly, use SpecialConstraintMask to test for constraint flags.
Examples
The following code example defines a generic type Test with two type parameters. The second type parameter has a base class constraint and a reference type constraint. When the program executes, the constraints are examined using the Type.GenericParameterAttributes property and the Type.GetGenericParameterConstraints method.
Note: |
---|
To run this example, see Building Examples That Use a Demo Method and a TextBlock Control. |
Imports System.Reflection
' Define a sample interface to use as an interface constraint.
Public Interface ITest
End Interface
' Define a base type to use as a base class constraint.
Public Class Base
End Class
' Define the generic type to examine. The first generic type parameter,
' T, derives from the class Base and implements ITest. This demonstrates
' a base class constraint and an interface constraint. The second generic
' type parameter, U, must be a reference type (Class) and must have a
' default constructor (New). This demonstrates special constraints.
'
Public Class Test(Of T As {Base, ITest}, U As {New, Class})
End Class
' Define a type that derives from Base and implements ITtest. This type
' satisfies the constraints on T in class Test.
Public Class Derived
Inherits Base
Implements ITest
End Class
Public Class Example
Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)
' To get the generic type definition, omit the type
' arguments but retain the comma to indicate the number
' of type arguments.
'
Dim def As Type = GetType(Test(Of ,))
outputBlock.Text += String.Format(vbCrLf & "Examining generic type {0}", def) & vbCrLf
' Get the type parameters of the generic type definition,
' and display them.
'
Dim defparams() As Type = def.GetGenericArguments()
For Each tp As Type In defparams
outputBlock.Text += String.Format(vbCrLf & "Type parameter: {0}", tp.Name) & vbCrLf
outputBlock.Text &= vbTab & ListGenericParameterAttributes(tp) & vbCrLf
' List the base class and interface constraints. The
' constraints do not appear in any particular order. An
' empty array is returned if there are no constraints.
'
Dim tpConstraints As Type() = _
tp.GetGenericParameterConstraints()
For Each tpc As Type In tpConstraints
outputBlock.Text &= vbTab & tpc.ToString() & vbCrLf
Next tpc
Next tp
End Sub
' List the variance and special constraint flags.
'
Private Shared Function ListGenericParameterAttributes(ByVal t As Type) As String
Dim retval As String
Dim gpa As GenericParameterAttributes = t.GenericParameterAttributes
' Select the variance flags.
Dim variance As GenericParameterAttributes = _
gpa And GenericParameterAttributes.VarianceMask
If variance = GenericParameterAttributes.None Then
retval = "No variance flag;"
Else
If (variance And GenericParameterAttributes.Covariant) <> 0 Then
retval = "Covariant;"
Else
retval = "Contravariant;"
End If
End If
' Select the constraint flags.
Dim constraints As GenericParameterAttributes = _
gpa And GenericParameterAttributes.SpecialConstraintMask
If constraints = GenericParameterAttributes.None Then
retval &= " no special constraints."
Else
If (constraints And GenericParameterAttributes.ReferenceTypeConstraint) <> 0 Then
retval &= " ReferenceTypeConstraint"
End If
If (constraints And GenericParameterAttributes.NotNullableValueTypeConstraint) <> 0 Then
retval &= " NotNullableValueTypeConstraint"
End If
If (constraints And GenericParameterAttributes.DefaultConstructorConstraint) <> 0 Then
retval &= " DefaultConstructorConstraint"
End If
End If
Return retval
End Function
End Class
' This example produces the following output:
'
'Examining generic type Test`2[T,U]
'
'Type parameter: T
' No variance flag; no special constraints.
' Base
' ITest
'
'Type parameter: U
' No variance flag; ReferenceTypeConstraint DefaultConstructorConstraint
'
using System;
using System.Reflection;
// Define a sample interface to use as an interface constraint.
public interface ITest { }
// Define a base type to use as a base class constraint.
public class Base { }
// Define the generic type to examine. The first generic type parameter,
// T, derives from the class Base and implements ITest. This demonstrates
// a base class constraint and an interface constraint. The second generic
// type parameter, U, must be a reference type (class) and must have a
// default constructor (new()). This demonstrates special constraints.
//
public class Test<T, U>
where T : Base, ITest
where U : class, new() { }
// Define a type that derives from Base and implements ITest. This type
// satisfies the constraints on T in class Test.
public class Derived : Base, ITest { }
public class Example
{
public static void Demo(System.Windows.Controls.TextBlock outputBlock)
{
// To get the generic type definition, omit the type
// arguments but retain the comma to indicate the number
// of type arguments.
//
Type def = typeof(Test<,>);
outputBlock.Text += String.Format("\r\nExamining generic type {0}", def) + "\n";
// Get the type parameters of the generic type definition,
// and display them.
//
Type[] defparams = def.GetGenericArguments();
foreach (Type tp in defparams)
{
outputBlock.Text += String.Format("\r\nType parameter: {0}", tp.Name) + "\n";
outputBlock.Text += String.Format("\t{0}",
ListGenericParameterAttributes(tp)) + "\n";
// List the base class and interface constraints. The
// constraints are returned in no particular order. If
// there are no class or interface constraints, an empty
// array is returned.
//
Type[] tpConstraints = tp.GetGenericParameterConstraints();
foreach (Type tpc in tpConstraints)
{
outputBlock.Text += String.Format("\t{0}", tpc) + "\n";
}
}
}
// List the variance and special constraint flags.
//
private static string ListGenericParameterAttributes(Type t)
{
string retval;
GenericParameterAttributes gpa = t.GenericParameterAttributes;
GenericParameterAttributes variance = gpa &
GenericParameterAttributes.VarianceMask;
// Select the variance flags.
if (variance == GenericParameterAttributes.None)
retval = "No variance flag;";
else
{
if ((variance & GenericParameterAttributes.Covariant) != 0)
retval = "Covariant;";
else
retval = "Contravariant;";
}
// Select
GenericParameterAttributes constraints = gpa &
GenericParameterAttributes.SpecialConstraintMask;
if (constraints == GenericParameterAttributes.None)
retval += " No special constraints";
else
{
if ((constraints & GenericParameterAttributes.ReferenceTypeConstraint) != 0)
retval += " ReferenceTypeConstraint";
if ((constraints & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)
retval += " NotNullableValueTypeConstraint";
if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
retval += " DefaultConstructorConstraint";
}
return retval;
}
}
/* This example produces the following output:
Examining generic type Test`2[T,U]
Type parameter: T
No variance flag; no special constraints.
Base
ITest
Type parameter: U
No variance flag; ReferenceTypeConstraint DefaultConstructorConstraint
*/
Version Information
Silverlight
Supported in: 5, 4, 3
Silverlight for Windows Phone
Supported in: Windows Phone OS 7.1, Windows Phone OS 7.0
XNA Framework
Supported in: Xbox 360, Windows Phone OS 7.0
Platforms
For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.