Scott Stafford
Scott Stafford

Reputation: 44776

How do I access and use generic type parameters as a regular type in C#?

I have a generic business object collection class which contains some business objects:

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject

I want to write a method on my Collection class that returns the type T and a method that returns a newly-instantiated object of type T.

In C++, this would be where you simply declare a typedef value_type T; and use BusinessObjectCollection::value_type but I can't find an equivalent in C#.

Any suggestions?

EDIT: One close parallel to the typedef I was thinking of is the method:

Type GetGenericParameter() { 
    return typeof(T); 
}

Upvotes: 0

Views: 567

Answers (2)

Mark Simpson
Mark Simpson

Reputation: 23365

With regards to finding a type:

If you need to know what the type of T is, you can simply use typeof(T).

Upvotes: 1

Andrew Hare
Andrew Hare

Reputation: 351506

Try something like this:

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject, new()
{
    // Here is a method that returns an instance
    // of type "T"
    public T GetT()
    {
        // And as long as you have the "new()" constraint above
        // the compiler will allow you to create instances of
        // "T" like this
        return new T();
    }
}

In C# you can use the type parameter (i.e. T) as you would any other type in your code - there is nothing extra you need to do.

In order to be able to create instances of T (without using reflection) you must constrain the type parameter with new() which will guarantee that any type arguments contain a parameterless constructor.

Upvotes: 10

Related Questions