Некоторые дополнительные, как работать с кодом ножниц. Предположим, у вас есть класс, похожий на
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
. Если нет точных совпадений типов, он будет искать метод параметра объекта, и если ни один из них не будет совпадать, будет сгенерировано исключение связывателя времени выполнения, предупреждающее, что ни один метод не соответствует.
Очевидным недостатком этого подхода является огромная потеря безопасности типов во время компиляции. Тем не менее, код в этом направлении позволит вам работать в очень динамичном смысле, который во время выполнения все еще полностью набирается, как вы ожидаете.