55

what i want to do is to automatically create some object.

In Java, class can be pass as parameter, for example

Class A{

}


Object createObjectBy(class clazz){
       // .. do construction work here
}

when using it, just ---> createObjectBy(A.class)

it is benefit for a lot of things.

so, how can i do similar thing in C#????

3
  • 3
    What exactly are you up to, C# might have better way of achieving that with a different syntax Commented Feb 3, 2010 at 19:53
  • 1
    You can achieve something like this using generics, but what are you trying to do that simply "new A()" will not work? Commented Feb 3, 2010 at 19:55
  • For getting method name see How can I find the method that called the current method? Commented Dec 10, 2020 at 7:15

4 Answers 4

65
Object createObjectBy(Type clazz){
   // .. do construction work here
    Object theObject = Activator.CreateInstance(clazz);
    return theObject;
}

Usage:

createObjectBy(typeof(A));

Or you could simply use Activator.CreateInstance directly :-)

Sign up to request clarification or add additional context in comments.

6 Comments

Just reminding that using this approach, your calling code should something like: Class B = (Class) CreateObjectBy(tyepof(A));
And this would fail if the type has no parameterless constructor
Hey, Aviad P, what if the class A have an argument? How could I pass it to the object theObject?
@Benedito there's an overload of CreateInstance that accepts parameters to the constructor: msdn.microsoft.com/en-us/library/wcxyzt4d(v=vs.110).aspx
Yeah, I saw that. But after it, I have found another problem. The class A has methods. I would like to use one of them inside the method that creates the instance. But Visual Studio indicates an compilation error, telling that "theObject" does not have such method. Do you know how to solve it? Or a place that I could look for it?
|
44

The ideal way would be to use generics

Type is known at design time

public static T CreateInstance<T>() where T: new()
{
    // Do some business logic
    Logger.LogObjectCreation(typeof(T));

    // Actualy instanciate the object
    return new T();
}

A call example would look like

var employee = CreateInstance<Employee>();

Type is unknown at runtime

If the type of object is unknown at runtime, for example through a plugin system, you need to use the Type class:

public static object CreateInstance(Type type)
{
    // Do some business logic
    Logger.LogObjectCreation(type);

    // Actualy instanciate the object
    return Activator.CreateInstance(type);
}

A call example would look like

var instance = CreateInstance(someType);

Performance

Of course, nothing beats instanciating an object than by using the keyword new. Except maybe not instanciating, but instead reusing an object, like through caching.

If you have to settle for the second method where the type is unknown, there are some alternatives to Activator.CreateInstance. Although the article recommend using lambda expression, your biggest consideration is:

  • Does your unknown object need to be instantiated often in a short period of time, or do you only create it once

If you only need to create your object once, just stick with the Activator.CreateInstance method. If you need to create it multiple time in a short time, try the lambda approach. That last approach is similar to a compiled regular expression vs. an on-the-fly regular expression.

1 Comment

For those who do not understand where T: new() : codeproject.com/Articles/16831/Constraints-in-Generics
7

Use the class Type. You can return an instance of it by call

obj.GetType();

or without an object instance

typeof(className);

I hope it helps.

Comments

5

C# doesn't support this. But what are you trying to do?

You probably could use:

createObjectBy(Type type);

or

createObjectBy<T>();

2 Comments

I typically use both of these methods where the second one just forwards to the first. The first allows for easy calls from reflection and for lazy passing and the second allows for easy (strong-typed) calls directly from code.
often some one downvotes for unknown reason.. they dont even have the guts to comment the reason.. plus one man..

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.