Посмотрите эту статью и этот простой пример . Быстрый перевод того же самого в ваши классы ...
var d1 = typeof(Task<>);
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);
В соответствии с вашим изменением: В этом случае вы можете сделать это ...
var d1 = Type.GetType("GenericTest.TaskA`1"); // GenericTest was my namespace, add yours
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);
Чтобы узнать, где я использовал обратную кавычку1 для имени общего класса, см. в этой статье .
Примечание: если ваш универсальный класс принимает несколько типов, вы должны включать запятые, когда опускаете имена типов, например:
Type type = typeof(IReadOnlyDictionary<,>);
В самом деле, вы не сможете написать последнюю строку.
Но вы, вероятно, не хотите создавать объект просто ради или создания его. Вероятно, вы захотите вызвать какой-то метод в своем недавно созданном экземпляре.
Затем вам понадобится что-то вроде интерфейса:
public interface ITask
{
void Process(object o);
}
public class Task<T> : ITask
{
void ITask.Process(object o)
{
if(o is T) // Just to be sure, and maybe throw an exception
Process(o as T);
}
public void Process(T o) { }
}
и вызовите его с помощью:
Type d1 = Type.GetType("TaskA"); //or "TaskB"
Type[] typeArgs = { typeof(Item) };
Type makeme = d1.MakeGenericType(typeArgs);
ITask task = Activator.CreateInstance(makeme) as ITask;
// This can be Item, or any type derived from Item
task.Process(new Item());
В любом случае вы не будете статически преобразованы в тип, которого вы не знаете заранее (в данном случае "makeme"). ITask позволяет вам добраться до вашего целевого типа.
Если это не то, что вы хотите, вам, вероятно, нужно будет более конкретно указать, чего вы пытаетесь достичь с помощью этого.
То, что вам нужно, - это подмножество двухрядных браслетов (подмножество точно определяется n символа A и m символа B). Набор из всех браслетов позволяет варьировать количество A и B.
Следующий код распечатывает последовательности, которые вам нужны, и делает это в лексическом порядке и с постоянным амортизированным временем.
Make sure you're doing this for a good reason, a simple function like the following would allow static typing and allows your IDE to do things like "Find References" and Refactor -> Rename.
public Task <T> factory (String name)
{
Task <T> result;
if (name.CompareTo ("A") == 0)
{
result = new TaskA ();
}
else if (name.CompareTo ("B") == 0)
{
result = new TaskB ();
}
return result;
}