2010-06-30 14 views
5

Sé que no se pueden miembros estáticos de los miembros de la instancia.Una forma de obtener información no estática del contexto estático

Pero digamos que tengo en un montaje de esto:

public class ClassA 
{ 
    public List<order> GetOrders(int orderID) 
    { 
     ... 
    } 
} 

Luego, en otro montaje de esto:

public static ClassB 
{ 
    private static void DoSomethingElse(int orderID) 
    { 
     List<order> orderList = ClassA.GetOrders(orderID); 
     ...rest of code 
    } 
} 

¿Hay alguna manera de seguir recibiendo en ese método en la clase A de alguna otra manera ... algunos trabajan alrededor de esto?

+1

Necesitará una instancia de 'ClassA' para llamar a' GetOrders (..) 'ya que no está marcado como' static'. ¿Querías decir que es 'estático 'en su lugar? –

+0

ClassA es un Singleton – PositiveGuy

+0

Supongo que podría pasar el Singleton al otro ensamblado posiblemente en ese método en ClassB – PositiveGuy

Respuesta

12

Por supuesto que puede de acceso a miembros estáticos de los miembros de instancia ... pero se debe entender por qué no puede acceder a los miembros de instancia sin una instancia.

Su clase básicamente dice que cada instancia de ClassA le permite obtener una lista de las órdenes asociadas con una ID en particular. Ahora, diferentes instancias de ClassA pueden arrojar resultados diferentes; por ejemplo, podrían estar conectadas a diferentes bases de datos. ¿Qué resultados desea obtener en DoSomethingElse?

Para dar un ejemplo sencillo, supongamos que tenemos una clase Person, y cada persona tenía un nombre: "¿Qué es Person.Name"

public class Person 
{ 
    public string Name { get; set; } 
} 

¿Tiene sentido preguntar No, porque no has especificado de qué persona estás hablando.

Debe o bien hacer ClassA.GetOrders estática - si es que no implica ninguna información por instancia, incluidos los miembros virtuales - o hacer ClassB consciente de la instancia de ClassA utilizar al enterarse de las órdenes.

Si pudieras darnos a conocer nombres más realistas para estas clases, podríamos orientarnos acerca de qué solución es más probable que sea apropiado ... personalmente yo preferiría favorecer este último enfoque, ya que los miembros estáticos generalmente lideran a un código menos comprobable.

+0

Estoy hablando de acceder a miembros no estáticos a través de miembros estáticos ... al revés, lo cual no es posible. – PositiveGuy

+0

@coffeeaddict: "no estático" = "instancia". Mi primera oración es una respuesta a * tu * primera oración: "Sé que no puedes acceder a los miembros estáticos de los miembros de la instancia y viceversa". Eso está mal. –

+0

Sí, entiendo todo esto. Supongo que solo me preguntaba si había alguna alternativa para evitar este problema. No quiero cambiar ClassA para que sea estático o viceversa. Tendría un gran problema de refactorización. – PositiveGuy

4

No estoy seguro de que tengo razón, pero trato new ClassA().GetOrder(orderID);

+0

ClassA es un singleton ... – PositiveGuy

1

Sé que no puede acceder a los miembros estáticos de los miembros de la instancia y viceversa.

En realidad se puede.

public class MyClass 
{ 
    public static void Foo() 
    { 
     Console.Write("Foo"); 
    } 

    public void Bar() 
    { 
     Foo(); // Perfectly valid call 
    } 
} 

Pero para ir a otro lado (instancia de estática) que necesita para crear realmente una instancia:

public class MyClass 
{ 
    public static void Foo() 
    { 
     MyClass c = new MyClass(); 
     c.Bar(); 
    } 

    public void Bar() 
    { 
     Console.Write("Foo"); 
    } 
} 

Puede ser confuso static con su significado en diferentes idiomas .En C#, significa que el miembro no está ligada a ninguna instancia específica de la clase, se puede, en efecto, llamar al miembro estático en los ejemplos anteriores como este:

MyClass.Foo(); 
0

Si necesita acceder a la instancia Singleton y se no tiene un acceso directo estático estático (como .Instance o .GetInstance()), luego puede inyectar la instancia en ClassB por algún medio antes de llamar al método (este ejemplo usa un campo público estático, pero querrá algo más seguro en la práctica) :

public static class ClassB 
{ 
    //The single instance has to be injected before DoSomethingElse can be used 
    public static ClassA ClassA; 

    private static void DoSomethingElse(int orderID) 
    { 
     List<Order> orderList = ClassA.GetOrders(orderID); 
     //...rest of code 
    } 
} 

Alternativamente, puede pasar la instancia de ClassA directamente a DoSomethingElse. Como ClassB depende de ClassA, podría tener más sentido que ClassB también sea un servicio de estilo singleton, lo que le permite inyectar la instancia de ClassA a través del constructor (quizás de forma automática con algún framework IoC).

Cuestiones relacionadas