2010-08-09 10 views
18

estoy atascado.Convertir Acción <T> a la acción <object>

¿Cómo convierto el Action<T> to an Action<Object> en C#?

Saludos Magnus

+5

La pregunta no tiene sentido, no puede crear una Acción , debe especificar un tipo. –

+1

Adivinando esta una de esas preguntas de covarianza/contravarianza, de lo contrario la respuesta sería 'Acción '. –

+2

No puede convertir un tipo genérico abierto en un Objeto, a menos que T esté restringido a la clase. En el código, la Acción asignada a la Acción es legal cuando T: clase. Steven, solo para aclarar esto, probablemente no pueda resolverse por covarianza. – Dykam

Respuesta

34

He aquí una muestra de lo que pide (verificación de tipos puede ser añadido en la última línea para manejar adecuadamente excepción de difusión no válido a ser más fácil de usar):

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

puede ser usted puede dar más detalles sobre la tarea, porque ahora parece un poco extraño.

+0

Gracias lo probaré más tarde. –

+0

Funciona. Gracias. :-) – Fanda

+1

guau maravilloso. Gracias hermano: D – brian

0

No está seguro de lo que quiere decir mediante la conversión ... La acción es la declaración genérica de un delegado de la acción ... si quieres un delegado de acción que trabaja en 'objeto' que haría algo como :

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

supongo que tienes algo como esto:

void Foo(Action<object> action) { } 

Action<something> myaction; 

y desea convertir miaccion para que pueda pasar a Foo.

que no funciona.

Foo puede pasar cualquier objeto a la acción cuyo tipo se deriva de objeto. Pero myaction solo acepta objetos que se derivan de algo.

0

que estaba buscando una manera de hacer esto hoy y tropezamos con este post. En realidad, la única manera sencilla que encontré para hacerlo era para envolver Acción <cadena> dentro de una nueva acción <objeto>. En mi caso, estaba impulsando mis acciones en un diccionario simultáneo y luego las recuperaba por tipo. Efectivamente, estaba procesando una cola de mensajes donde las acciones podrían definirse para manejar mensajes con una entrada tipeada particular.

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); 
Cuestiones relacionadas