Я знаю, что ваше сообщение указывает, что перенос в другого делегата не вариант, но, к сожалению, это действительно ваш лучший выбор здесь. CLR просто не допускает приведение между делегатами в этом направлении. Никакое количество отражения не может исправить это либо. Можете ли вы уточнить, почему это не вариант?
Причина в том, что это создает проблемы безопасности типов, потому что вызывающая сторона может передать любой объект в Action<object>
, в то время как Action<string>
может обрабатывать только строки. Даже если ваш код только передает string
, CLR не может гарантировать это и, следовательно, не допускает небезопасного преобразования.
Следующий лучший вариант, о котором я могу подумать, - это изменить исходный метод, который обернут в Action<string>
, с параметра типа string
на параметр, который принимает object
. Затем пусть он вручную проверит тип string
. Например
// Original Version
void Method(string str) {
// Operate on the string
}
// Modified version
void Method(object obj) {
string str = (string)obj;
// operate on the string
}