loki
loki

Reputation: 2966

Why do I need to use Activator CreateInstance?

I don't need to use create new instance via Activator createInstance so why do I need it? In which situations would I need to use Activator.CreateInstance()?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace App.CreateInstance
{
    class Program
    {
        static void Main(string[] args)
        {

            new MyCustomerManager().Save <MyCustomer>(new object[] {
                     1, 
                    "xxx", 
                    "yyyy" });
            }
    }

    public class MyCustomerManager
    {
        public void Save<TModel>(object[] Vals)
        {
            Type calcType = typeof(TModel);
            object instance = Activator.CreateInstance(calcType);
            PropertyInfo[] ColumnNames = instance.GetType()
                                                 .GetProperties();

            for (int i = 0; i < ColumnNames.Length; i++)
            {
                calcType.GetProperty(ColumnNames[i].Name,
                                       BindingFlags.Instance 
                                     | BindingFlags.Public    )
                .SetValue(instance, Vals[i], null);
            }

            string result = "";
            for (int i = 0; i < ColumnNames.Length; i++)
            {
                result += String.Format("{0}:{1}", 
                    ColumnNames[i].Name, c
                    alcType.GetProperty(ColumnNames[i].Name,
                                          BindingFlags.Instance 
                                        | BindingFlags.Public   )
                           .GetValue(instance, null).ToString());
            }
            Console.WriteLine(result);
            Console.ReadKey();
        }
    }

    // Model
    public class MyCustomer
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string SurName { get; set; }
    }
}

I can do that without Activator.CreateInstance:

using System.Reflection;

namespace App.ReflectionToGeneric4
{
    class Program
    {
        static void Main(string[] args)
        {
            object[] Vals = new object[] { 1, "xxx","yyyy" };
            new MyCustomerManager().Save<MyCustomer>(Vals);
        }
    }

    // Model
    public class MyCustomer
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string SurName { get; set; }
    }

    public class MyCustomerManager
    {
        public void Save<TModel>(object[] Vals) 
                                where TModel : class, new()
        {
            var instance = new TModel();
            Type calcType = instance.GetType();
            PropertyInfo[] ColumnNames = calcType.GetProperties();

            for (int i = 0; i < ColumnNames.Length; i++)
            {
                  calcType.GetProperty(ColumnNames[i].Name,
                                          BindingFlags.Instance
                                        | BindingFlags.Public    )
                          .SetValue(instance, Vals[i], null);
            }
            string result = "";
            for (int i = 0; i < ColumnNames.Length; i++)
            {
                result += String.Format("{0}:{1}", 
                    ColumnNames[i].Name, 
                    calcType.GetProperty(ColumnNames[i].Name, 
                                          BindingFlags.Instance 
                                        | BindingFlags.Public)
                            .GetValue(instance, null).ToString());
            }
            Console.WriteLine(result);
            Console.ReadKey();

        }
    }
}

Upvotes: 1

Views: 2685

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1062510

Scenarios:

  • you aren't using generics, but just Type-based code
  • you are using generic, but the constructor takes parameters - new() is limited to parameterless constructors
  • there is a parameterless constructor, but it is not accessible (IIRC Activator will use private constructors if you ask)

But yes, in your case the new() constraint is ideal.

Upvotes: 12

Related Questions