Некоторые дополнительные, как работать с кодом ножниц. Предположим, у вас есть класс, похожий на
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
Предположим, во время выполнения у вас есть FooContent
Если бы вы смогли связать во время компиляции, вы бы хотели
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
Однако вы не можете сделать это во время выполнения. Чтобы сделать это во время выполнения, вы должны сделать следующее:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
Динамически вызывать Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown( (dynamic) dynamicList)
Обратите внимание на использование dynamic
в вызове метода. Во время выполнения dynamicList
будет List<FooContent>
(дополнительно также существующий IEnumerable<FooContent>
), поскольку даже использование динамического все еще укоренено в строго типизированном языке, средство связывания времени выполнения выберет соответствующий Markdown
метод. Если нет точных совпадений типов, он будет искать метод параметра объекта, и если ни один из них не совпадает, будет сгенерировано исключение связывателя времени выполнения, предупреждающее, что ни один метод не совпадает.
Очевидным недостатком этого подхода является огромная потеря безопасности типов во время компиляции. Тем не менее, код в этом направлении позволит вам работать в очень динамичном смысле, который во время выполнения все еще полностью напечатан, как вы ожидаете.