This strikes me as a very poor way to do things - but it's pretty simple, depending on what exactly you are trying to do.
Assuming you have classes thus:
public abstract class Topaz { }
public class Topaz1 : Topaz { }
public class Topaz2 : Topaz { }
public class Topaz3 : Topaz { }
public class Topaz4 : Topaz { }
public class Topaz5 : Topaz { }
public class Topaz6 : Topaz { }
public class Topaz7 : Topaz { }
Then if you are filtering an existing list of instances to just the types you want:
private List<Topaz> FilterThem(IEnumerable<Topaz> source, int lo, int hi)
{
return source.Where(s => InRange(s, lo, hi)).ToList();
}
private bool InRange(Topaz t, int lo, int hi)
{
int n = int.Parse(t.GetType().Name.Substring(5));
return (lo < n && n <= hi);
}
If you are trying to create instances, that's a lot more messy:
private List<Topaz> CreateThem(int lo, int hi)
{
List<Topaz> list = new List<Topaz>();
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
string name = assembly.FullName.Split(',')[0] + ".Topaz";
for (int i = lo + 1; i <= hi; i++)
{
list.Add((Topaz)assembly.CreateInstance(name + i));
}
return list;
}
But I still think you have made some poor design decisions here!