What does typeof do in C#?

Author: Geym

Mar. 07, 2024

Home & Garden

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Represents type declarations: class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.

The following example shows a few representative features of Type. The C# typeof operator (GetType operator in Visual Basic) is used to get a Type object representing String. From this Type object, the GetMethod method is used to get a MethodInfo representing the String.Substring overload that takes a starting location and a length.

To identify the overload signature, the code example creates a temporary array containing two Type objects representing int (Integer in Visual Basic).

The code example uses the MethodInfo to invoke the Substring method on the string "Hello, World!", and displays the result.

For more information about this API, see Supplemental API remarks for Type.

When you inherit from Type, you must override the following members:

Initializes a new instance of the Type class.

Represents a missing value in the Type information. This field is read-only.

Represents the case-insensitive member filter used on names. This field is read-only.

Represents the case-sensitive member filter used on names. This field is read-only.

Represents the member filter used on attributes. This field is read-only.

Represents an empty array of type Type . This field is read-only.

Separates names in the namespace of the Type . This field is read-only.

Indicates the type provided by the common language runtime that represents this type.

Gets the initializer for the type.

Gets the handle for the current Type .

Gets a StructLayoutAttribute that describes the layout of the current type.

Gets the class object that was used to obtain this member.

Gets the namespace of the Type .

Gets the name of the current member.

When overridden in a derived class, gets the name of the current type.

Gets the module (the DLL) in which the current Type is defined.

Gets a value that identifies a metadata element.

Gets a MemberTypes value indicating that this member is a type or a nested type.

Gets a value indicating whether the Type can be accessed by code outside the assembly.

Gets a value that indicates whether the type is an array type that can represent a multi-dimensional array or an array with an arbitrary lower bound.

Gets a value indicating whether the Type is a value type.

Gets a value that indicates whether the current Type is an unmanaged function pointer.

Gets a value indicating whether the string format attribute UnicodeClass is selected for the Type .

Gets a value that indicates whether the type is a type definition.

Gets a value that indicates whether the type is an array type that can represent only a single-dimensional array with a zero lower bound.

Gets a value indicating whether the type has a name that requires special handling.

Gets a value that indicates whether the type is a signature type.

Gets a value indicating whether the Type is binary serializable.

Gets a value that indicates whether the current type is transparent at the current trust level, and therefore cannot perform critical operations.

Gets a value that indicates whether the current type is security-safe-critical at the current trust level; that is, whether it can perform critical operations and can be accessed by transparent code.

Gets a value that indicates whether the current type is security-critical or security-safe-critical at the current trust level, and therefore can perform critical operations.

Gets a value indicating whether the Type is declared sealed.

Gets a value indicating whether the Type is declared public.

Gets a value indicating whether the Type is one of the primitive types.

Gets a value indicating whether the Type is a pointer.

Gets a value indicating whether the Type is not declared public.

Gets a value indicating whether a class is nested and declared public.

Gets a value indicating whether the Type is nested and declared private.

Gets a value indicating whether the Type is nested and visible only to classes that belong to either its own family or to its own assembly.

Gets a value indicating whether the Type is nested and visible only within its own family.

Gets a value indicating whether the Type is nested and visible only to classes that belong to both its own family and its own assembly.

Gets a value indicating whether the Type is nested and visible only within its own assembly.

Gets a value indicating whether the current Type object represents a type whose definition is nested inside the definition of another type.

Gets a value indicating whether the Type is marshaled by reference.

Gets a value indicating whether the fields of the current type are laid out sequentially, in the order that they were defined or emitted to the metadata.

Gets a value indicating whether the Type is an interface; that is, not a class or a value type.

Gets a value indicating whether the Type has a ComImportAttribute attribute applied, indicating that it was imported from a COM type library.

Gets a value that indicates whether the current Type represents a type parameter in the definition of a generic type.

Gets a value indicating whether the current Type represents a generic type definition, from which other generic types can be constructed.

Gets a value indicating whether the current type is a generic type.

Gets a value indicating whether the current Type represents a type parameter in the definition of a generic type or method.

Gets a value that indicates whether the current Type represents a type parameter in the definition of a generic method.

Gets a value that indicates whether the current Type is a function pointer.

Gets a value indicating whether the fields of the current type are laid out at explicitly specified offsets.

Gets a value indicating whether the current Type represents an enumeration.

Gets a value indicating whether the Type can be hosted in a context.

Gets a value that indicates whether this object represents a constructed generic type. You can create instances of a constructed generic type.

Gets a value indicating whether the Type is a COM object.

Gets a value that indicates whether this MemberInfo object is part of an assembly held in a collectible AssemblyLoadContext .

Gets a value indicating whether the Type is a class or a delegate; that is, not a value type or interface.

Gets a value that indicates whether the type is a byref-like structure.

Gets a value indicating whether the Type is passed by reference.

Gets a value indicating whether the fields of the current type are laid out automatically by the common language runtime.

Gets a value indicating whether the string format attribute AutoClass is selected for the Type .

Gets a value that indicates whether the type is an array.

Gets a value indicating whether the string format attribute AnsiClass is selected for the Type .

Gets a value indicating whether the Type is abstract and must be overridden.

Gets a value indicating whether the current Type encompasses or refers to another type; that is, whether the current Type is an array, a pointer, or is passed by reference.

Gets the GUID associated with the Type .

Gets an array of the generic type arguments for this type.

Gets the position of the type parameter in the type parameter list of the generic type or method that declared the parameter, when the Type object represents a type parameter of a generic type or a generic method.

Gets a combination of GenericParameterAttributes flags that describe the covariance and special constraints of the current generic type parameter.

Gets the fully qualified name of the type, including its namespace but not its assembly.

Gets a reference to the default binder, which implements internal rules for selecting the appropriate members to be called by InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) .

Gets the type that declares the current nested type or generic type parameter.

Gets a MethodBase that represents the declaring method, if the current Type represents a type parameter of a generic method.

Gets a collection that contains this member's custom attributes.

Gets a value indicating whether the current Type object has type parameters that have not been replaced by specific types.

Gets the type from which the current Type directly inherits.

Gets the attributes associated with the Type .

Gets the assembly-qualified name of the type, which includes the name of the assembly from which this Type object was loaded.

Gets the Assembly in which the type is declared. For generic types, gets the Assembly in which the generic type is defined.

Equals(Object)

Determines if the underlying system type of the current Type object is the same as the underlying system type of the specified Object.

Equals(Type)

Determines if the underlying system type of the current Type is the same as the underlying system type of the specified Type.

FindInterfaces(TypeFilter, Object)

Returns an array of Type objects representing a filtered list of interfaces implemented or inherited by the current Type.

FindMembers(MemberTypes, BindingFlags, MemberFilter, Object)

Returns a filtered array of MemberInfo objects of the specified member type.

GetArrayRank()

Gets the number of dimensions in an array.

GetAttributeFlagsImpl()

When overridden in a derived class, implements the Attributes property and gets a bitwise combination of enumeration values that indicate the attributes associated with the Type.

GetConstructor(BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

Searches for a constructor whose parameters match the specified argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetConstructor(BindingFlags, Binder, Type[], ParameterModifier[])

Searches for a constructor whose parameters match the specified argument types and modifiers, using the specified binding constraints.

GetConstructor(BindingFlags, Type[])

Searches for a constructor whose parameters match the specified argument types, using the specified binding constraints.

GetConstructor(Type[])

Searches for a public instance constructor whose parameters match the types in the specified array.

GetConstructorImpl(BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

When overridden in a derived class, searches for a constructor whose parameters match the specified argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetConstructors()

Returns all the public constructors defined for the current Type.

GetConstructors(BindingFlags)

When overridden in a derived class, searches for the constructors defined for the current Type, using the specified BindingFlags.

GetCustomAttributes(Boolean)

When overridden in a derived class, returns an array of all custom attributes applied to this member.

(Inherited from MemberInfo) GetCustomAttributes(Type, Boolean)

When overridden in a derived class, returns an array of custom attributes applied to this member and identified by Type.

(Inherited from MemberInfo) GetCustomAttributesData()

Returns a list of CustomAttributeData objects representing data about the attributes that have been applied to the target member.

(Inherited from MemberInfo) GetDefaultMembers()

Searches for the members defined for the current Type whose DefaultMemberAttribute is set.

GetElementType()

When overridden in a derived class, returns the Type of the object encompassed or referred to by the current array, pointer or reference type.

GetEnumName(Object)

Returns the name of the constant that has the specified value, for the current enumeration type.

GetEnumNames()

Returns the names of the members of the current enumeration type.

GetEnumUnderlyingType()

Returns the underlying type of the current enumeration type.

GetEnumValues()

Returns an array of the values of the constants in the current enumeration type.

GetEnumValuesAsUnderlyingType()

Retrieves an array of the values of the underlying type constants of this enumeration type.

GetEvent(String)

Returns the EventInfo object representing the specified public event.

GetEvent(String, BindingFlags)

When overridden in a derived class, returns the EventInfo object representing the specified event, using the specified binding constraints.

GetEvents()

Returns all the public events that are declared or inherited by the current Type.

GetEvents(BindingFlags)

When overridden in a derived class, searches for events that are declared or inherited by the current Type, using the specified binding constraints.

GetField(String)

Searches for the public field with the specified name.

GetField(String, BindingFlags)

Searches for the specified field, using the specified binding constraints.

GetFields()

Returns all the public fields of the current Type.

GetFields(BindingFlags)

When overridden in a derived class, searches for the fields defined for the current Type, using the specified binding constraints.

GetFunctionPointerCallingConventions()

When overridden in a derived class, returns the calling conventions of the current function pointer Type.

GetFunctionPointerParameterTypes()

When overridden in a derived class, returns the parameter types of the current function pointer Type.

GetFunctionPointerReturnType()

When overridden in a derived class, returns the return type of the current function pointer Type.

GetGenericArguments()

Returns an array of Type objects that represent the type arguments of a closed generic type or the type parameters of a generic type definition.

GetGenericParameterConstraints()

Returns an array of Type objects that represent the constraints on the current generic type parameter.

GetGenericTypeDefinition()

Returns a Type object that represents a generic type definition from which the current generic type can be constructed.

GetHashCode()

Returns the hash code for this instance.

GetInterface(String)

Searches for the interface with the specified name.

GetInterface(String, Boolean)

When overridden in a derived class, searches for the specified interface, specifying whether to do a case-insensitive search for the interface name.

GetInterfaceMap(Type)

Returns an interface mapping for the specified interface type.

GetInterfaces()

When overridden in a derived class, gets all the interfaces implemented or inherited by the current Type.

GetMember(String)

Searches for the public members with the specified name.

GetMember(String, BindingFlags)

Searches for the specified members, using the specified binding constraints.

GetMember(String, MemberTypes, BindingFlags)

Searches for the specified members of the specified member type, using the specified binding constraints.

GetMembers()

Returns all the public members of the current Type.

GetMembers(BindingFlags)

When overridden in a derived class, searches for the members defined for the current Type, using the specified binding constraints.

GetMemberWithSameMetadataDefinitionAs(MemberInfo)

Searches for the MemberInfo on the current Type that matches the specified MemberInfo.

GetMethod(String)

Searches for the public method with the specified name.

GetMethod(String, BindingFlags)

Searches for the specified method, using the specified binding constraints.

GetMethod(String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

Searches for the specified method whose parameters match the specified argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])

Searches for the specified method whose parameters match the specified argument types and modifiers, using the specified binding constraints.

GetMethod(String, BindingFlags, Type[])

Searches for the specified method whose parameters match the specified argument types, using the specified binding constraints.

GetMethod(String, Int32, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

Searches for the specified method whose parameters match the specified generic parameter count, argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetMethod(String, Int32, BindingFlags, Binder, Type[], ParameterModifier[])

Searches for the specified method whose parameters match the specified generic parameter count, argument types and modifiers, using the specified binding constraints.

GetMethod(String, Int32, Type[])

Searches for the specified public method whose parameters match the specified generic parameter count and argument types.

GetMethod(String, Int32, Type[], ParameterModifier[])

Searches for the specified public method whose parameters match the specified generic parameter count, argument types and modifiers.

GetMethod(String, Type[])

Searches for the specified public method whose parameters match the specified argument types.

GetMethod(String, Type[], ParameterModifier[])

Searches for the specified public method whose parameters match the specified argument types and modifiers.

GetMethodImpl(String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

When overridden in a derived class, searches for the specified method whose parameters match the specified argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetMethodImpl(String, Int32, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

When overridden in a derived class, searches for the specified method whose parameters match the specified generic parameter count, argument types and modifiers, using the specified binding constraints and the specified calling convention.

GetMethods()

Returns all the public methods of the current Type.

GetMethods(BindingFlags)

When overridden in a derived class, searches for the methods defined for the current Type, using the specified binding constraints.

GetNestedType(String)

Searches for the public nested type with the specified name.

GetNestedType(String, BindingFlags)

When overridden in a derived class, searches for the specified nested type, using the specified binding constraints.

GetNestedTypes()

Returns the public types nested in the current Type.

GetNestedTypes(BindingFlags)

When overridden in a derived class, searches for the types nested in the current Type, using the specified binding constraints.

GetOptionalCustomModifiers()

When overridden in a derived class, returns the optional custom modifiers of the current Type.

GetProperties()

Returns all the public properties of the current Type.

GetProperties(BindingFlags)

When overridden in a derived class, searches for the properties of the current Type, using the specified binding constraints.

GetProperty(String)

Searches for the public property with the specified name.

GetProperty(String, BindingFlags)

Searches for the specified property, using the specified binding constraints.

GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])

Searches for the specified property whose parameters match the specified argument types and modifiers, using the specified binding constraints.

GetProperty(String, Type)

Searches for the public property with the specified name and return type.

GetProperty(String, Type, Type[])

Searches for the specified public property whose parameters match the specified argument types.

GetProperty(String, Type, Type[], ParameterModifier[])

Searches for the specified public property whose parameters match the specified argument types and modifiers.

GetProperty(String, Type[])

Searches for the specified public property whose parameters match the specified argument types.

GetPropertyImpl(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])

When overridden in a derived class, searches for the specified property whose parameters match the specified argument types and modifiers, using the specified binding constraints.

GetRequiredCustomModifiers()

When overridden in a derived class, returns the required custom modifiers of the current Type.

GetType()

Gets the current Type.

GetType()

Gets the Type of the current instance.

(Inherited from Object) GetType(String)

Gets the Type with the specified name, performing a case-sensitive search.

GetType(String, Boolean)

Gets the Type with the specified name, performing a case-sensitive search and specifying whether to throw an exception if the type is not found.

GetType(String, Boolean, Boolean)

Gets the Type with the specified name, specifying whether to throw an exception if the type is not found and whether to perform a case-sensitive search.

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)

Gets the type with the specified name, optionally providing custom methods to resolve the assembly and the type.

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)

Gets the type with the specified name, specifying whether to throw an exception if the type is not found, and optionally providing custom methods to resolve the assembly and the type.

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)

Gets the type with the specified name, specifying whether to perform a case-sensitive search and whether to throw an exception if the type is not found, and optionally providing custom methods to resolve the assembly and the type.

GetTypeArray(Object[])

Gets the types of the objects in the specified array.

GetTypeCode(Type)

Gets the underlying type code of the specified Type.

GetTypeCodeImpl()

Returns the underlying type code of this Type instance.

GetTypeFromCLSID(Guid)

Gets the type associated with the specified class identifier (CLSID).

GetTypeFromCLSID(Guid, Boolean)

Gets the type associated with the specified class identifier (CLSID), specifying whether to throw an exception if an error occurs while loading the type.

GetTypeFromCLSID(Guid, String)

Gets the type associated with the specified class identifier (CLSID) from the specified server.

GetTypeFromCLSID(Guid, String, Boolean)

Gets the type associated with the specified class identifier (CLSID) from the specified server, specifying whether to throw an exception if an error occurs while loading the type.

GetTypeFromHandle(RuntimeTypeHandle)

Gets the type referenced by the specified type handle.

GetTypeFromProgID(String)

Gets the type associated with the specified program identifier (ProgID), returning null if an error is encountered while loading the Type.

GetTypeFromProgID(String, Boolean)

Gets the type associated with the specified program identifier (ProgID), specifying whether to throw an exception if an error occurs while loading the type.

GetTypeFromProgID(String, String)

Gets the type associated with the specified program identifier (progID) from the specified server, returning null if an error is encountered while loading the type.

GetTypeFromProgID(String, String, Boolean)

Gets the type associated with the specified program identifier (progID) from the specified server, specifying whether to throw an exception if an error occurs while loading the type.

GetTypeHandle(Object)

Gets the handle for the Type of a specified object.

HasElementTypeImpl()

When overridden in a derived class, implements the HasElementType property and determines whether the current Type encompasses or refers to another type; that is, whether the current Type is an array, a pointer, or is passed by reference.

InvokeMember(String, BindingFlags, Binder, Object, Object[])

Invokes the specified member, using the specified binding constraints and matching the specified argument list.

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

Invokes the specified member, using the specified binding constraints and matching the specified argument list and culture.

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

When overridden in a derived class, invokes the specified member, using the specified binding constraints and matching the specified argument list, modifiers and culture.

IsArrayImpl()

When overridden in a derived class, implements the IsArray property and determines whether the Type is an array.

IsAssignableFrom(Type)

Determines whether an instance of a specified type c can be assigned to a variable of the current type.

IsAssignableTo(Type)

Determines whether the current type can be assigned to a variable of the specified targetType.

IsByRefImpl()

When overridden in a derived class, implements the IsByRef property and determines whether the Type is passed by reference.

IsCOMObjectImpl()

When overridden in a derived class, implements the IsCOMObject property and determines whether the Type is a COM object.

IsContextfulImpl()

Implements the IsContextful property and determines whether the Type can be hosted in a context.

IsDefined(Type, Boolean)

When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member.

(Inherited from MemberInfo) IsEnumDefined(Object)

Returns a value that indicates whether the specified value exists in the current enumeration type.

IsEquivalentTo(Type)

Determines whether two COM types have the same identity and are eligible for type equivalence.

IsInstanceOfType(Object)

Determines whether the specified object is an instance of the current Type.

IsMarshalByRefImpl()

Implements the IsMarshalByRef property and determines whether the Type is marshaled by reference.

IsPointerImpl()

When overridden in a derived class, implements the IsPointer property and determines whether the Type is a pointer.

IsPrimitiveImpl()

When overridden in a derived class, implements the IsPrimitive property and determines whether the Type is one of the primitive types.

IsSubclassOf(Type)

Determines whether the current Type derives from the specified Type.

IsValueTypeImpl()

Implements the IsValueType property and determines whether the Type is a value type; that is, not a class or an interface.

MakeArrayType()

Returns a Type object representing a one-dimensional array of the current type, with a lower bound of zero.

MakeArrayType(Int32)

Returns a Type object representing an array of the current type, with the specified number of dimensions.

MakeByRefType()

Returns a Type object that represents the current type when passed as a ref parameter (ByRef parameter in Visual Basic).

MakeGenericMethodParameter(Int32)

Returns a signature type object that can be passed into the Type[] array parameter of a GetMethod method to represent a generic parameter reference.

MakeGenericSignatureType(Type, Type[])

Creates a generic signature type, which allows third party reimplementations of Reflection to fully support the use of signature types in querying type members.

MakeGenericType(Type[])

Substitutes the elements of an array of types for the type parameters of the current generic type definition and returns a Type object representing the resulting constructed type.

MakePointerType()

Returns a Type object that represents a pointer to the current type.

MemberwiseClone()

Creates a shallow copy of the current Object.

(Inherited from Object) ReflectionOnlyGetType(String, Boolean, Boolean)

Obsolete.

Gets the Type with the specified name, specifying whether to perform a case-sensitive search and whether to throw an exception if the type is not found. The type is loaded for reflection only, not for execution.

ToString()

Returns a String representing the name of the current Type.

typeof, alternately also typeOf, and TypeOf, is an operator provided by several programming languages to determine the data type of a variable. This is useful when constructing programs that must accept multiple types of data without explicitly specifying the type.

In languages that support polymorphism and type casting, the typeof operator may have one of two distinct meanings when applied to an object. In some languages, such as Visual Basic,[1] the typeof operator returns the dynamic type of the object. That is, it returns the true, original type of the object, irrespective of any type casting. In these languages, the typeof operator is the method for obtaining run-time type information.

In other languages, such as C#[2] or D[3] and, to some degree, in C (as part of nonstandard extensions and proposed standard revisions),[4][5] the typeof operator returns the static type of the operand. That is, it evaluates to the declared type at that instant in the program, irrespective of its original form. These languages usually have other constructs for obtaining run-time type information, such as typeid.

Examples

[

edit

]

In a non-standard (GNU) extension of the C programming language, typeof may be used to define a general macro for determining the maximum value of two parameters:

#define max(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b; })

In C#:

// Given an object, returns if it is an integer.

// The "is" operator can be also used to determine this.

public

static

bool

IsInteger

(

object

o

)

{

return

o

.

GetType

()

==

typeof

(

int

);

}

As of C23 typeof is a part of the C standard. The operator typeof_unqual was also added which is the same as typeof, except it removes cvr-qualification and atomic qualification.[6][7] In VB.NET, the C# variant of "typeof" should be translated into the VB.NET's GetType method. The TypeOf keyword in VB.NET is used to compare an object reference variable to a data type.

The following example uses TypeOf...Is expressions to test the type compatibility of two object reference variables with various data types.

Dim

refInteger

As

Object

=

2

MsgBox

(

"TypeOf Object[Integer] Is Integer? "

&

TypeOf

refInteger

Is

Integer

)

MsgBox

(

"TypeOf Object[Integer] Is Double? "

&

TypeOf

refInteger

Is

Double

)

Dim

refForm

As

Object

=

New

System

.

Windows

.

Forms

.

Form

MsgBox

(

"TypeOf Object[Form] Is Form? "

&

TypeOf

refForm

Is

System

.

Windows

.

Forms

.

Form

)

MsgBox

(

"TypeOf Object[Form] Is Label? "

&

TypeOf

refForm

Is

System

.

Windows

.

Forms

.

Label

)

MsgBox

(

"TypeOf Object[Form] Is Control? "

&

TypeOf

refForm

Is

System

.

Windows

.

Forms

.

Control

)

MsgBox

(

"TypeOf Object[Form] Is IComponent? "

&

TypeOf

refForm

Is

System

.

ComponentModel

.

IComponent

)

In JavaScript:

function

isNumber

(

n

)

{

return

(

typeof

n

===

'number'

);

}

In TypeScript:[8]

function

(

param

:

typeof

existingObject

)

{

...

}

let

newObject

:

typeof

existingObject

;

See also

[

edit

]

References

[

edit

]

What does typeof do in C#?

Wikipedia

58

0

Comments

Please Join Us to post.

0/2000

All Comments ( 0 )

Guest Posts

If you are interested in sending in a Guest Blogger Submission,welcome to write for us!

Your Name: (required)

Your Email: (required)

Subject:

Your Message: (required)