You can use a factory where your key would be the type, this article has some examples.
If you can afford to use IoC, is better if you let IoC engine decide which concrete class should be used based on a string, you should configure your containers accordingly. This string can be Type name. I suggest ninject but any other IoC like windsor can work.
Below is an example of how can be done using a factory with generic interfaces, since in your case there is contructor you need to pass is it.
public class Factory<T>
{
public Factory()
{
_Mappings = new Dictionary<string,Func<IInterface<T>>>(2);
_Mappings.Add("MyClass1", () => new MyClass1() as IInterface<T>);
_Mappings.Add("MyClass2", () => new MyClass2() as IInterface<T>);
}
public IInterface<T> Get(string typeName)
{
Func<IInterface<T>> func;
if (_Mappings.TryGetValue(typeName, out func))
{
return func();
}
else
throw new NotImplementedException();
}
readonly Dictionary<string, Func<IInterface<T>>> _Mappings;
}
public class MyClass1 : IInterface<int>
{
public int Method()
{
throw new NotImplementedException();
}
}
public class MyClass2 : IInterface<string>
{
public string Method()
{
throw new NotImplementedException();
}
}
public interface IInterface<T>
{
T Method();
}
I still think IoC is better, but this is a valid approach.