• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 481
  • Last Modified:

why i need Activator CreateInstance?

Why i need Activator CreateInstance? i don't need to use create new instance via Activator createInstance can you explain why i need Activator. can you give some advise when 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, calcType.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; }
    }
}

Open in new window

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();

        }
    }
}

Open in new window

why i need create Instance? Can you show me?
0
programmerist
Asked:
programmerist
  • 2
1 Solution
 
saraganiCommented:
Hi, in this case you don't need the Activator...
You should better have this:

public void Save<TModel>(object[] Vals) where TModel : new()


This way you can also have value types (like int) as the TModel.
0
 
saraganiCommented:
You will probably need the activator in cases where the function is not generic (For example, you get a type or an instance and you need to create a new one).
I use it in MEF, but there are plenty more situation where you can use it.

You can also use it if the parameter-less constructor is private (Which will not work with the new() trick):

 TModel instance = (TModel)Activator.CreateInstance(typeof(TModel), true);


The activator can also be called with:
 TModel instance = (TModel)Activator.CreateInstance(typeof(TModel), params);
(where params is array of objects).

This way you can call a non-parameterless constructor.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now