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