Как динамически создать универсальный объект C # с помощью отражения? [Дубликат]

126
задан Jeff 20 July 2009 в 02:33
поделиться

4 ответа

Посмотрите эту статью и этот простой пример . Быстрый перевод того же самого в ваши классы ...

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<,>);
236
ответ дан 24 November 2019 в 00:45
поделиться

В самом деле, вы не сможете написать последнюю строку.

Но вы, вероятно, не хотите создавать объект просто ради или создания его. Вероятно, вы захотите вызвать какой-то метод в своем недавно созданном экземпляре.

Затем вам понадобится что-то вроде интерфейса:

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 позволяет вам добраться до вашего целевого типа.

Если это не то, что вы хотите, вам, вероятно, нужно будет более конкретно указать, чего вы пытаетесь достичь с помощью этого.

8
ответ дан 24 November 2019 в 00:45
поделиться

То, что вам нужно, - это подмножество двухрядных браслетов (подмножество точно определяется n символа A и m символа B). Набор из всех браслетов позволяет варьировать количество A и B.

Следующий код распечатывает последовательности, которые вам нужны, и делает это в лексическом порядке и с постоянным амортизированным временем.

3
ответ дан 24 November 2019 в 00:45
поделиться

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;
}
1
ответ дан 24 November 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: