Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All

CodeTypeParameter Class

Represents a type parameter of a generic type or method.


Namespace:  System.CodeDom
Assembly:  System (in System.dll)

<SerializableAttribute> _
<ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)> _
<ComVisibleAttribute(True)> _
Public Class CodeTypeParameter _
	Inherits CodeObject

The CodeTypeParameter type exposes the following members.

Public methodCodeTypeParameterInitializes a new instance of the CodeTypeParameter class.
Public methodCodeTypeParameter(String)Initializes a new instance of the CodeTypeParameter class with the specified type parameter name.

Public propertyConstraintsGets the constraints for the type parameter.
Public propertyCustomAttributesGets the custom attributes of the type parameter.
Public propertyHasConstructorConstraintGets or sets a value indicating whether the type parameter has a constructor constraint.
Public propertyNameGets or sets the name of the type parameter.
Public propertyUserDataGets the user-definable data for the current object. (Inherited from CodeObject.)

Public methodEquals(Object)Determines whether the specified object is equal to the current object. (Inherited from Object.)
Protected methodFinalizeAllows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public methodGetHashCodeServes as the default hash function. (Inherited from Object.)
Public methodGetTypeGets the Type of the current instance. (Inherited from Object.)
Protected methodMemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Public methodToStringReturns a string that represents the current object. (Inherited from Object.)

The CodeTypeParameter class represents a type parameter in the declaration of a generic type or method.

A generic type or method declaration contains one or more unspecified types known as type parameters. A type parameter name stands for the type within the body of the generic declaration. For example, the generic declaration for the List(Of T) class contains the type parameter T.

For more information on generics, see Generics in the .NET Framework Class Library (C# Programming Guide).

The following code example shows the use of the CodeTypeParameter class to create a CodeDOM graph to generate an application containing generics code.

Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.Collections
Imports System.Collections.Specialized
Imports System.IO
Imports System.Reflection
Imports System.Text.RegularExpressions
Imports System.Globalization
Imports System.Collections.Generic

Class CodeDomGenericsDemo

    Shared Sub Main()
            CreateGenericsCode("vb", "Generic.vb", "GenericVB.exe")
        Catch e As Exception
            LogMessage(("Unexpected Exception:" + e.ToString()))
        End Try 

    End Sub 'Main

    Shared Sub CreateGenericsCode(ByVal providerName As String, ByVal sourceFileName As String, ByVal assemblyName As String)

        Dim provider As CodeDomProvider = CodeDomProvider.CreateProvider(providerName)

        LogMessage("Building CodeDOM graph...")

        Dim cu As New CodeCompileUnit()

        CreateGraph(provider, cu)

        Dim sw As New StringWriter()

        LogMessage("Generating code...")
        provider.GenerateCodeFromCompileUnit(cu, sw, Nothing)

        Dim output As String = sw.ToString()
        output = Regex.Replace(output, "Runtime version:[^" + vbCr + vbLf + "]*", "Runtime version omitted for demo")

        LogMessage("Displaying source code...")

        LogMessage("Writing source code to file...")
        Dim s As Stream = File.Open(sourceFileName, FileMode.Create)
        Dim t As New StreamWriter(s)

        Dim opt As New CompilerParameters(New String() {"System.dll", "System.Xml.dll", "System.Windows.Forms.dll", "System.Data.dll", "System.Drawing.dll"})
        opt.GenerateExecutable = False
        opt.TreatWarningsAsErrors = True
        opt.IncludeDebugInformation = True
        opt.GenerateInMemory = True 

        Dim results As CompilerResults

        LogMessage(("Compiling with provider " + providerName))
        results = provider.CompileAssemblyFromFile(opt, sourceFileName)

        If results.NativeCompilerReturnValue <> 0 Then
            LogMessage("Compilation failed.")
            LogMessage("Demo completed successfully.")
        End If

    End Sub 'CreateGenericsCode

    ' Create a CodeDOM graph. 
    Shared Sub CreateGraph(ByVal provider As CodeDomProvider, ByVal cu As CodeCompileUnit)
        ' Determine if the generator supports generics. 
        If Not provider.Supports(GeneratorSupport.GenericTypeReference Or GeneratorSupport.GenericTypeDeclaration) Then 
            ' Return if the generator does not support generics. 
        End If 
        Dim ns As New CodeNamespace("DemoNamespace")
        ns.Imports.Add(New CodeNamespaceImport("System"))
        ns.Imports.Add(New CodeNamespaceImport("System.Collections.Generic"))

        ' Declare a generic class. 
        Dim class1 As New CodeTypeDeclaration()
        class1.Name = "MyDictionary"
        class1.BaseTypes.Add( _
            New CodeTypeReference("Dictionary", _
                New CodeTypeReference() {New CodeTypeReference("TKey"), _
                    New CodeTypeReference("TValue")}))
        Dim kType As New CodeTypeParameter("TKey")
        kType.HasConstructorConstraint = True
        kType.Constraints.Add(New CodeTypeReference(GetType(IComparable)))
        kType.CustomAttributes.Add _
            (New CodeAttributeDeclaration("System.ComponentModel.DescriptionAttribute", _
                New CodeAttributeArgument(New CodePrimitiveExpression("KeyType"))))
        Dim iComparableT As New CodeTypeReference("IComparable")
        iComparableT.TypeArguments.Add(New CodeTypeReference(kType))


        Dim vType As New CodeTypeParameter("TValue")
        vType.Constraints.Add(New CodeTypeReference(GetType(IList(Of System.String))))
        vType.CustomAttributes.Add _
            (New CodeAttributeDeclaration("System.ComponentModel.DescriptionAttribute", _
                New CodeAttributeArgument(New CodePrimitiveExpression("ValueType"))))


        ' Declare a generic method. 
        Dim printMethod As New CodeMemberMethod()
        Dim sType As New CodeTypeParameter("S")
        sType.HasConstructorConstraint = True 
        Dim tType As New CodeTypeParameter("T")
        tType.HasConstructorConstraint = True

        printMethod.Name = "Print"

        printMethod.Statements.Add(ConsoleWriteLineStatement _
            (New CodeDefaultValueExpression(New CodeTypeReference("T"))))
        printMethod.Statements.Add(ConsoleWriteLineStatement _
            (New CodeDefaultValueExpression(New CodeTypeReference("S"))))
        printMethod.Attributes = MemberAttributes.Public

        Dim class2 As New CodeTypeDeclaration()
        class2.Name = "Demo" 

        Dim methodMain As New CodeEntryPointMethod()

        Dim [myClass] As New CodeTypeReference("MyDictionary", _
            New CodeTypeReference() {New CodeTypeReference(GetType(Integer)), _
                New CodeTypeReference("List", _
                    New CodeTypeReference() {New CodeTypeReference("System.String")})})

        methodMain.Statements.Add(New CodeVariableDeclarationStatement([myClass], _
            "dict", New CodeObjectCreateExpression([myClass])))

        methodMain.Statements.Add(ConsoleWriteLineStatement _
            (New CodePropertyReferenceExpression _
                (New CodeVariableReferenceExpression("dict"), "Count")))

        methodMain.Statements.Add _
            (New CodeExpressionStatement _
                (New CodeMethodInvokeExpression _
                    (New CodeMethodReferenceExpression _
                        (New CodeVariableReferenceExpression("dict"), _
                            "Print", New CodeTypeReference() _
                                    {New CodeTypeReference("System.Decimal"), _
                                        New CodeTypeReference("System.Int32")}), _
                                            New CodeExpression(-1) {})))
        Dim longTypeName As String = GetType( _
            System.Collections.Generic.Dictionary(Of Integer, _
                System.Collections.Generic.List(Of String))()).FullName

        Dim longType As New CodeTypeReference(longTypeName)

        methodMain.Statements.Add(New CodeVariableDeclarationStatement _
            (longType, "dict2", New CodeArrayCreateExpression _
                (longType, New CodeExpression(0) {New CodePrimitiveExpression(Nothing)})))

        methodMain.Statements.Add(ConsoleWriteLineStatement(New CodePropertyReferenceExpression(New CodeVariableReferenceExpression("dict2"), "Length")))


    End Sub 'CreateGraph

    Overloads Shared Function ConsoleWriteLineStatement(ByVal exp As CodeExpression) As CodeStatement
        Return New CodeExpressionStatement(New CodeMethodInvokeExpression _
            (New CodeMethodReferenceExpression _
                (New CodeTypeReferenceExpression _
                    (New CodeTypeReference("Console")), "WriteLine"), _
                        New CodeExpression() {exp}))

    End Function 'ConsoleWriteLineStatement

    Overloads Shared Function ConsoleWriteLineStatement(ByVal [text] As String) As CodeStatement
        Return ConsoleWriteLineStatement(New CodePrimitiveExpression([text]))

    End Function 'ConsoleWriteLineStatement

    Shared Sub LogMessage(ByVal [text] As String)

    End Sub 'LogMessage

    Shared Sub OutputResults(ByVal results As CompilerResults)
        LogMessage(("NativeCompilerReturnValue=" + results.NativeCompilerReturnValue.ToString()))
        Dim s As String 
        For Each s In results.Output
        Next s

    End Sub 'OutputResults
End Class 'CodeDomGenericsDemo 

' This example generates the following code: 
' <auto-generated> 
'     This code was generated by a tool. 
'     Runtime Version:2.0.50727.1434 

'     Changes to this file may cause incorrect behavior and will be lost if 
'     the code is regenerated. 
' </auto-generated> 

'Option Strict Off 
'Option Explicit On 

'Imports System 
'Imports System.Collections.Generic 

'Namespace DemoNamespace 

'    Public Class MyDictionary(Of TKey As  {System.IComparable, IComparable(Of TKey), New}, TValue As System.Collections. 
'Generic.IList(Of String)) 
'        Inherits Dictionary(Of TKey, TValue) 

'        Public Overridable Sub Print(Of S As New, T As New)() 
'            Console.WriteLine(CType(Nothing, T)) 
'            Console.WriteLine(CType(Nothing, S)) 
'        End Sub 
'    End Class 

'    Public Class Demo 

'        Public Shared Sub Main() 
'            Dim dict As MyDictionary(Of Integer, List(Of String)) = New MyDictionary(Of Integer, List(Of String)) 
'            Console.WriteLine(dict.Count) 
'            dict.Print(Of Decimal, Integer)() 
'            Dim dict2() As System.Collections.Generic.Dictionary(Of Integer, System.Collections.Generic.List(Of String)) 
' = New System.Collections.Generic.Dictionary(Of Integer, System.Collections.Generic.List(Of String))() {Nothing} 
'            Console.WriteLine(dict2.Length) 
'        End Sub 
'    End Class 
'End Namespace

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
© 2015 Microsoft