У меня есть общий интерфейс и куча классов, которые его реализуют. Вот очень упрощенный пример:Как вызвать общий метод со слабо типизированным параметром
interface IPrinter<in T>
{
void Print(T args);
}
class IntPrinter : IPrinter<int>
{
public void Print(int args)
{
Console.WriteLine("This is int: " +args);
}
}
class StringPrinter : IPrinter<string>
{
public void Print(string args)
{
Console.WriteLine("This is string: " + args);
}
}
У меня также есть словарь этих классов с типом родового аргумента в качестве ключа (я на самом деле использовать отражение для его заполнения):
private readonly Dictionary<Type, object> Printers
= new Dictionary<Type, object>
{
{typeof (int), new IntPrinter()},
{typeof (string), new StringPrinter()}
};
Теперь я Recive экземпляр List<object>
в виде ввода, который содержит кучу параметров произвольного типа. Для каждого параметра я хочу выбрать объект, который реализует соответствующий интерфейс и вызывает метод печати. Я не уверен, как это реализовать.
var args = new List<object> {1, "2"};
foreach (var arg in args)
{
var printer = Printers[arg.GetType()];
//how do I implement this method so it calls ((IPrinter<T>)printer).Print((T)arg)?
Print(printer, arg);
}
Я попытался
Отражение. Это работает, но хорошо ... его отражение. Я ищу другие способы сделать это.
private void Print(object printer, object arg) { printer.GetType().GetMethod("Print").Invoke(printer, new[] {arg}); }
Динамический. Гораздо чище, чем отражение, и обычно быстрее. Но по какой-то причине он генерирует исключение, если я использую его с типом, который равен
private
относительно выполнения сборки. Является ли это известным ограничением динамических объектов?private void Print(dynamic printer, dynamic arg) { printer.Print(arg); }
Делегат. Я пытался использовать метод
CreateDelegate
для создания своего рода делегата с слабым типом отMethodInfo
, но я полностью не справился с этим. Возможно ли это?
Я думаю, что это не будет компилироваться. У меня также нет универсального интерфейса «IPrinter». –
Woops did not замечают это, как насчет сейчас? – maksymiuk
У меня есть два 'объекта' как вход (см. Цикл 'foreach' в моем вопросе). Как я могу назвать ваш метод? –