2010-05-07 23 views
7

Tengo situación en la que tengo que llamar al método de interfaz mediante la reflexión, como este.NET Reflection: ¿Cómo llamar al método de interfaz sin crear una instancia?

object x = null; 
MethodInfo method = interfaceExists.GetMethod("ShutDown"); 
method.Invoke(x, new object[] { 4 }) 

Como se puede ver no lo creo instancia de objeto! Y, como puedo supuesto, recibo excepción

método no estático requiere un objetivo

y pregunta, ¿Puedo llamar al método de interfaz mediante la reflexión sin crear instancia de interfaz y en caso afirmativo, ¿Cómo Yo puedo hacerlo ?

+0

Piénselo de esta manera: ¿Qué haría realmente este método * * si pudiera invocarlo? – Aaronaught

Respuesta

12

Si estás absolutamente seguro el método de interfaz no afectará el estado del objeto (y generalmente es una suposición muy mala), puede crear una instancia sin llamar al constructor llamando al FormatterServices.GetUnitializedObject. Personalmente, recomendaría encarecidamente no hacerlo, ya que podría suceder cualquier cantidad de cosas malas cuando llame a un método de interfaz en un tipo no inicializado.

+3

+1 para técnicas secretas ninja. – Will

+0

Gracias, quizás sea razonable para mí – jitm

10

Si se trata de un método de instancia, necesita una instancia para llamar al método. Por lo tanto, el método de "instancia".

Los métodos de instancia pueden tener dependencias en variables de instancia, que la reflexión no conocería, por lo que no puede garantizar que un método de instancia no altere el estado de la instancia del tipo en el que está definido.

Es por eso que obtendrá esas advertencias de FxCop (parafraseando aquí) "Haga este método estático ya que no altera el estado de la clase".

+0

¿Cómo puedo hacer que el método de la interfaz sea estático? – jitm

+0

No puede tener métodos estáticos en una interfaz. Necesitarás un método estático en una clase, si no quieres que la clase se use, márcalo como abstracto e implementa la interfaz, luego deriva tus subclases de ella. – Ian

+0

@jitm no puedes. Si ** realmente realmente ** necesita hacer esto, considere abandonar su interfaz para una clase base. Por supuesto, no puede anular los métodos estáticos de la clase base, por lo que aún puede ser atornillado.Intente hacer otra pregunta en SO (no use esta) que detalle lo que está tratando de hacer, y pregunte si hay una mejor manera. – Will

4

Si el método no es estático, debe crear una instancia de objeto para usarlo. Como las interfaces no pueden tener métodos estáticos, debe crear una instancia de un objeto con la interfaz para ejecutar el método.

1

Una interfaz no tiene implementación, por lo que no puede invocar su método sin una instancia de un objeto que implemente esa interfaz.

2

Su método de interfaz no estático eventualmente necesitará llamar a un método que se implementa en un objeto. Si la implementación del método no existe, entonces no se puede llamar a ningún método real.

1

¿Se puede llamar a un método de interfaz sin crear una instancia? No. Las interfaces son, por ejemplo, miembros; los miembros de la clase estática no están relacionados con las interfaces.

Usted puede ser capaz de conseguir lo que quieres, proporcionando una implementación estática de la interfaz,

public class MyImplementation : IMyInterface 
{ 
    public static readonly Instance = new MyImplementation(); 
    private MyImplementation() { } 
} 
// ...then your code might look like: 
MethodInfo method = typeof(IMyInterface).GetMethod("ShutDown"); 
method.Invoke(MyImplementation.Instance, new object[] { 4 }) 

O usted podría hacer un método de extensión:

public static class MyExtensions 
{ 
    public static void ShutDown(this IMyInterface obj, ...) { ... } 
} 
// ...then your code might look like: 
object x = null; 
MethodInfo method = typeof(MyExtensions).GetMethod("ShutDown"); 
method.Invoke(x as IMyInterface, new object[] { 4 }); 
+0

Gracias, lo sé. – jitm

Cuestiones relacionadas