У меня есть этот класс, чтобы генерировать случайные объекты:Изменение общего типа из класса
public class Generator<T>
{
private Random rnd = new Random();
private List<Type> types = new List<Type>();
public Generator()
{
//can't a generic type constraint that says "implements any interface" so I use this ugly thing...
if (!typeof(T).IsInterface)
throw new Exception("Generator needs to be instanciated with an interface generic parameter");
types = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.GetInterfaces().Contains(typeof(T))).ToList();
}
public T GetRandomObject()
{
int index = rnd.Next(types.Count);
return (T)Activator.CreateInstance(types[index]);
}
public void SetNewGeneric<N>()
{
T = N; //this doesn't work...
types = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.GetInterfaces().Contains(typeof(T))).ToList();
}
}
Я использую его так:
Generator<IEnemy> generator = new Generator<IEnemy>();
var randomEnemy = generator.GetRandomObject(); //create and return randomly, any object that implements IEnemy...
мой вопрос, есть ли способ изменить тип T
во время выполнения, так что я могу сделать что-то вроде
generator.SetGeneric<IWeapon>();
var weapon = generator.GetRandomObject();
любых других способов я мог бы это сделать, если я забираю g неправильный путь?
Спасибо.
Тогда 'generator' больше не является' 'Генератор. Как вы ожидаете, что это будет работать, и как вы хотите это использовать? –
Amit
Как сделать генератор статическим и иметь свойство Set вернуть типизированный генератор. Таким образом, вы не создаете экземпляр генератора с заданным типом, но можете динамически устанавливать тип, а затем становиться случайным. –
lintmouse