Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In C#, how to instantiate a passed generic type inside a method?

Tags:

c#

generics

How can I instantiate the type T inside my InstantiateType<T> method below?

I'm getting the error: 'T' is a 'type parameter' but is used like a 'variable'.:

(SCROLL DOWN FOR REFACTORED ANSWER)

using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespace TestGeneric33 {     class Program     {         static void Main(string[] args)         {             Container container = new Container();             Console.WriteLine(container.InstantiateType<Customer>("Jim", "Smith"));             Console.WriteLine(container.InstantiateType<Employee>("Joe", "Thompson"));             Console.ReadLine();         }     }      public class Container     {         public T InstantiateType<T>(string firstName, string lastName) where T : IPerson         {             T obj = T();             obj.FirstName(firstName);             obj.LastName(lastName);             return obj;         }      }      public interface IPerson     {         string FirstName { get; set; }         string LastName { get; set; }     }      public class Customer : IPerson     {         public string FirstName { get; set; }         public string LastName { get; set; }         public string Company { get; set; }     }      public class Employee : IPerson     {         public string FirstName { get; set; }         public string LastName { get; set; }         public int EmployeeNumber { get; set; }     } } 

REFACTORED ANSWER:

Thanks for all the comments, they got me on the right track, this is what I wanted to do:

using System;  namespace TestGeneric33 {     class Program     {         static void Main(string[] args)         {             Container container = new Container();             Customer customer1 = container.InstantiateType<Customer>("Jim", "Smith");             Employee employee1 = container.InstantiateType<Employee>("Joe", "Thompson");             Console.WriteLine(PersonDisplayer.SimpleDisplay(customer1));             Console.WriteLine(PersonDisplayer.SimpleDisplay(employee1));             Console.ReadLine();         }     }      public class Container     {         public T InstantiateType<T>(string firstName, string lastName) where T : IPerson, new()         {             T obj = new T();             obj.FirstName = firstName;             obj.LastName = lastName;             return obj;         }     }      public interface IPerson     {         string FirstName { get; set; }         string LastName { get; set; }     }      public class PersonDisplayer     {         private IPerson _person;          public PersonDisplayer(IPerson person)         {             _person = person;         }          public string SimpleDisplay()         {             return String.Format("{1}, {0}", _person.FirstName, _person.LastName);         }          public static string SimpleDisplay(IPerson person)         {             PersonDisplayer personDisplayer = new PersonDisplayer(person);             return personDisplayer.SimpleDisplay();         }     }      public class Customer : IPerson     {         public string FirstName { get; set; }         public string LastName { get; set; }         public string Company { get; set; }     }      public class Employee : IPerson     {         public string FirstName { get; set; }         public string LastName { get; set; }         public int EmployeeNumber { get; set; }     } } 
like image 249
Edward Tanguay Avatar asked Mar 18 '09 16:03

Edward Tanguay


2 Answers

Declare your method like this:

public string InstantiateType<T>(string firstName, string lastName)                where T : IPerson, new() 

Notice the additional constraint at the end. Then create a new instance in the method body:

T obj = new T();     
like image 151
Joel Coehoorn Avatar answered Oct 07 '22 15:10

Joel Coehoorn


Couple of ways.

Without specifying the type must have a constructor:

T obj = default(T); //which will produce null for reference types 

With a constructor:

T obj = new T(); 

But this requires the clause:

where T : new() 
like image 29
annakata Avatar answered Oct 07 '22 13:10

annakata