Я застрял.
Как преобразовать Action<T> to an Action<Object>
в С#?
Отношения Magnus
Я застрял.
Как преобразовать Action<T> to an Action<Object>
в С#?
Отношения Magnus
Здесь пример того, что вы запрашиваете (проверка типа может быть добавлена в последнюю строку для правильной обработки недопустимого исключения исключения, чтобы быть более удобным):
public Action<object> Convert<T>(Action<T> myActionT)
{
if (myActionT == null) return null;
else return new Action<object>(o => myActionT((T)o));
}
Возможно, вы можете указать более подробную информацию о задаче, потому что сейчас это выглядит немного странно.
Не уверен, что вы подразумеваете под преобразованием... Действие - это общее объявление делегата действия... если вы хотите, чтобы делегат действия работал на "объекте", вы сделали бы что-то вроде:
var myAction = new Action<object>(obj=> ... );
Я предполагаю, что у вас есть что-то вроде этого:
void Foo(Action<object> action) { }
Action<something> myaction;
И хочу преобразовать myaction, чтобы вы могли передать его Foo.
Это не работает.
Foo может передать любой объект действию, тип которого выводится из объекта. Но myaction принимает только объекты, которые происходят от чего-то.
Я искал способ сделать это сегодня и наткнулся на этот пост. Действительно, единственный простой способ, который я нашел для этого, - обернуть Action <string> в новом Action <object> . В моем случае я подталкивал свои действия в параллельный словарь, а затем возвращал их по типу. Фактически, я обрабатывал очередь сообщений, где действия могли быть определены для обработки сообщений с определенным введенным вводом.
var _actions = new ConcurrentDictionary<Type, Action<object>>();
Action<string> actionStr = s => Console.WriteLine(s);
var actionObj = new Action<object>(obj => { var castObj = (V)Convert.ChangeType(obj, typeof(V)); actionStr(castObj); } );
_actions.TryAdd(typeof(string), actionObj);