Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use variable as type and instantiate it

Tags:

c#

First of all, I want to say that I'm new to C#, so this question may seem completely off track.

I have a set of enumerables called ShapeType:

Cube, Sphere, Rectangle, Ellipse

And a method to return a random value from the enumerables:

private static ShapeType GetRandomShape()
{
    Array values = Enum.GetValues(typeof(ShapeType));
    Random random = new Random();
    ShapeType randomShape = (ShapeType)values.GetValue(random.Next(values.Length));
    return randomShape;
}

Every enumerable has a corresponding concrete class. And the question I'm wondering about is if you can instantiate a class by using the random enumerable value randomShape, kind of like this:

private static Shape GetRandomShape()
{
    Array values = Enum.GetValues(typeof(ShapeType));
    Random random = new Random();
    ShapeType randomShape = (ShapeType)values.GetValue(random.Next(values.Length));
    Shape shape = new randomShape(); // *Here use the randomShape-variable as type*
    return shape;
}

Is this possible or is it just wishful thinking?

like image 697
Jesper Avatar asked May 04 '17 12:05

Jesper


3 Answers

You can use a dictionary to retrieve a factory function for every value of the enum:

static readonly Dictionary<ShapeType, Func<Shape>> _factoryLookup = new Dictionary<ShapeType, Func<Shape>>
{
    [ShapeType.Cube] = () => new Cube(),
    [ShapeType.Ellipse] = () => new Ellipse(),
    [ShapeType.Rectangle] = () => new Rectangle(),
    [ShapeType.Sphere] = () => new Sphere(),
};

static readonly Random random = new Random();

private static Shape GetRandomShape()
{
    Array values = Enum.GetValues(typeof(ShapeType));
    ShapeType randomShape = (ShapeType)values.GetValue(random.Next(values.Length));
    Func<Shape> factory = _factoryLookup[randomShape];
    Shape shape = factory();
    return shape;
}
like image 67
Alessandro D'Andria Avatar answered Sep 24 '22 16:09

Alessandro D'Andria


You need to use factory method pattern:

public class Shape {}

public class Cube : Shape {}

public class Sphere : Shape {}

public class Rectangle : Shape {}

public class Ellipse : Shape {}

public Shape randomShape(ShapeType shapeType)
{
    switch(shapeType)
    {
         case ShapeType.Cube:
         return new Cube();
         ...
    }
}
like image 43
BWA Avatar answered Sep 25 '22 16:09

BWA


Create a Dictionary, with enumvalue as key, and type as value.

Dictionary<ShapeType, Type> dic = new Dictionary<ShapeType, Type>();
dic.Add(ShapeType.Cube, typeof(Cube));

// ...

private static Shape GetRandomShape()
{
    Array values = Enum.GetValues(typeof(ShapeType));
    Random random = new Random();
    ShapeType randomShape = (ShapeType)values.GetValue(random.Next(values.Length));
    Shape shape = Activator.CreateInstance(dic[randomShape]); // *Here use the randomShape-variable as type*
    return shape;
}
like image 22
Natrium Avatar answered Sep 22 '22 16:09

Natrium