Деякі додаткові способи роботи з кодом ножиць. Припустимо, у вас клас схожий на
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
метод. Якщо немає точного відповідності типу, він буде шукати метод параметра параметра об'єкта, і якщо жоден з них не відповідає винятку в'яжучої версії виконання, попереджаючи, що жоден метод не збігається.
Очевидний підхід до цього підходу - це величезна втрата безпеки типу під час компіляції. Тим не менш, код у цих рядках дозволить вам працювати в дуже динамічному сенсі, що під час виконання все ще повністю набирається, як ви очікуєте.