2012-04-10 21 views
10

que estoy tratando de hacer algo como esto:Cómo desempacar un objeto de C# para el tipo dinámico

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

Obviamente estoy confundido aquí. Sé que podría hacer este trabajo con sólo escribir una sentencia condicional -

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- pero no hay alguna manera de hacer esto en tiempo de ejecución?

EDIT Estoy de acuerdo que quizás no sea la mejor opción de diseño, así que aquí está el contexto. El punto del código anterior es la clase de base Repository para Mongo DB. Quiero que sea capaz de manejar diferentes tipos de tablas. Por lo tanto, someMethod() es realmente eliminar; y TypeA y TypeB son ObjectID y Guid; el código en la parte inferior es parte de un método agotado remove que acepta el ID como una cadena; y getObject() es un método para analizar el parámetro ID.

+0

Se están fusionando un 't' de texto con la información de tipo de tiempo de ejecución asociado a él:' typeof (T) '. No son lo mismo y no pueden ser sustituidos el uno por el otro. –

+0

Es probable que haya mejores opciones de diseño, pero dejó el objetivo real del código fuera de su publicación. Tal vez podríamos proporcionarle una forma mejor y totalmente diferente de escribir la solución a su problema si nos deja saber qué estaba tratando de lograr con este código. –

+0

@Kirk Woll, sé la diferencia, solo quería ilustrar lo que estaba tratando de hacer. – McGarnagle

Respuesta

20

Si está utilizando .NET 4 y C# 4, se puede utilizar para este dynamic:

dynamic obj = GetObject(); 
SomeMethod(obj); 

De lo contrario, tendrá que utilizar la reflexión para encontrar e invocar el método correcto. La resolución de sobrecarga (para los tipos que no sean dynamic) se realiza en compilar -time.

(Tenga en cuenta que a menos que TypeA y TypeB son estructuras, usted no estaría unboxing de todos modos ...)

+0

o 'obj.SomeMethod()'? –

+0

@RobertHarvey: No se le da la forma en que está escrita la pregunta, donde está seleccionando sobrecargas dentro del mismo tipo. –

+0

¡Agradable! Exactamente lo que estaba buscando, gracias. – McGarnagle

Cuestiones relacionadas