2012-05-31 21 views
5

Estoy bastante seguro de que esto se preguntó antes, pero desafortunadamente lo único que encontré fue this que no fue la solución para mí. En mi proyecto actual que hago algo así como:¿Cómo puedo lanzar objetos dinámicamente?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

Este código no funciona, por supuesto, porque yo no he echo obj porque su tipo cambia de forma dinámica.

¿Cómo puedo lanzarlo dinámicamente?

+4

Parece que esta no sería la mejor manera de hacer las cosas. Me huele un tipo de código. ¿Cuál es el contexto más amplio de lo que estás tratando de lograr? – FishBasketGordo

+0

Además de inicializarlo, ¿qué más piensas hacer con 'obj'? –

+0

@RaymondChen Acabo de hacer un proyecto simple de WinForm para probar mis bibliotecas de clase. – Leri

Respuesta

9

tres opciones:

  • Si el control de ambas clases, y usted puede hacer a implementar una interfaz común que incluye todo lo necesario, a continuación, hacer eso - y emitidos a la interfaz
  • Si eres usando C# 4 y .NET 4, puede usar tipado dinámico - simplemente declare la variable como private dynamic obj; y compilará y encontrará el método correcto en el momento de la ejecución
  • De lo contrario, use la función de reflexión para buscar y llamar al método.

Básicamente fundición basado en un tipo de tiempo de ejecución no tiene sentido, como parte del punto de fundición es dar al compilador más información ... y simplemente no tienen que, en este caso.

La primera opción es de lejos la más agradable si es posible.

+1

¿qué ocurre con la inyección de dependencias –

+1

Inyección de dependencias sin interfaces/clase base abstracta? ¿Cómo? Si se pueden definir interfaces, el escenario primero es suficiente – Tilak

+0

¿No sería mejor una clase base que una interfaz? Esta es una * is-a * (clase abstracta), en oposición a una * can-do * (interfaz). Suponiendo que los tipos son similares en naturaleza, por supuesto – mattytommo

0

Supongo que CreatInstanceB() debería usar MyClassB, ¿correcto?

En este caso, puede utilizar:

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

O usted podría hacer una interfaz que tiene un método de inicialización y definir obj como esta interfaz.

+0

Creo que, en el método de inicialización, no se conocen MyClassA o MyClassB, que es el punto en la pregunta – Tilak

+0

Sí, tiene razón. He editado la pregunta. Será mejor que use la palabra clave 'dynamic' como se sugirió @JonSkeet. – Leri

+0

Es cierto, se perdió eso. Siempre podemos confiar en el Sr. Skeet. – Slugart

Cuestiones relacionadas