Название немного неясно. Я хочу знать, возможно ли это:
string typeName = <read type name from somwhere>;
Type myType = Type.GetType(typeName);
MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>();
Очевидно, MyGenericClass описывается как:
public class MyGenericClass<T>
В данный момент компилятор жалуется, что «Тип или пространство имен« myType »не может быть найден». Должен быть способ сделать это.
foo.Method((dynamic)myGenericClass)
для привязки методов во время выполнения, фактически шаблон поиска служб для перегрузок методов типа.public void Method<T>(T obj)
- трюк, который я использовал более чем несколько раз за последние 6 лет с момента этого комментария; pОтветы:
Вы не можете сделать это без отражения. Тем не менее, вы можете сделать это с отражением. Вот полный пример:
Примечание: если ваш универсальный класс принимает несколько типов, вы должны включать запятые, когда опускаете имена типов, например:
источник
К сожалению, нет, нет. Универсальные аргументы должны быть разрешены во время компиляции как 1) допустимый тип или 2) другой универсальный параметр. Невозможно создать универсальные экземпляры, основанные на значениях времени выполнения, без большого труда использовать отражение.
источник
Некоторые дополнительные, как работать с кодом ножниц. Предположим, у вас есть класс, похожий на
Предположим, во время выполнения у вас есть FooContent
Если бы вы смогли связать во время компиляции, вы бы хотели
Однако вы не можете сделать это во время выполнения. Чтобы сделать это во время выполнения, вы должны сделать следующее:
Динамически вызывать
Markdown(IEnumerable<FooContent> contents)
Обратите внимание на использование
dynamic
в вызове метода. Во время выполненияdynamicList
будетList<FooContent>
(дополнительно также существующийIEnumerable<FooContent>
), поскольку даже использование динамического все еще укоренено в строго типизированном языке, средство связывания времени выполнения выберет соответствующийMarkdown
метод. Если нет точных совпадений типов, он будет искать метод параметра объекта, и если ни один из них не совпадает, будет сгенерировано исключение связывателя времени выполнения, предупреждающее, что ни один метод не совпадает.Очевидным недостатком этого подхода является огромная потеря безопасности типов во время компиляции. Тем не менее, код в этом направлении позволит вам работать в очень динамичном смысле, который во время выполнения все еще полностью напечатан, как вы ожидаете.
источник
Мои требования немного отличались, но, надеюсь, кому-то помогут. Мне нужно было прочитать тип из конфига и создать универсальный тип динамически.
Наконец, вот как вы это называете. Определите тип с помощью обратной черты .
источник
Если вы знаете, какие типы будут переданы, вы можете сделать это без размышлений. Переключатель заявление будет работать. Очевидно, это будет работать только в ограниченном числе случаев, но это будет намного быстрее, чем отражение.
источник
В этом фрагменте я хочу показать, как создавать и использовать динамически создаваемый список. Например, я добавляю в динамический список здесь.
Точно так же вы можете вызвать любой другой метод в списке.
источник