Подтвердить что ты не робот

Преобразовать действие <T> в действие <объект>

Я застрял.

Как преобразовать Action<T> to an Action<Object> в С#?

Отношения Magnus

4b9b3361

Ответ 1

Здесь пример того, что вы запрашиваете (проверка типа может быть добавлена ​​в последнюю строку для правильной обработки недопустимого исключения исключения, чтобы быть более удобным):

public Action<object> Convert<T>(Action<T> myActionT)
{
    if (myActionT == null) return null;
    else return new Action<object>(o => myActionT((T)o));
}

Возможно, вы можете указать более подробную информацию о задаче, потому что сейчас это выглядит немного странно.

Ответ 2

Не уверен, что вы подразумеваете под преобразованием... Действие - это общее объявление делегата действия... если вы хотите, чтобы делегат действия работал на "объекте", вы сделали бы что-то вроде:

var myAction = new Action<object>(obj=> ... );

Ответ 3

Я предполагаю, что у вас есть что-то вроде этого:

void Foo(Action<object> action) { }

Action<something> myaction;

И хочу преобразовать myaction, чтобы вы могли передать его Foo.

Это не работает.

Foo может передать любой объект действию, тип которого выводится из объекта. Но myaction принимает только объекты, которые происходят от чего-то.

Ответ 4

Я искал способ сделать это сегодня и наткнулся на этот пост. Действительно, единственный простой способ, который я нашел для этого, - обернуть 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);