2010-06-30 4 views
5

인스턴스 멤버의 정적 멤버를 사용할 수 없다는 것을 알고 있습니다. 정적 컨텍스트에서 비 정적 정보를 가져 오는 방법

그러나

내가 하나의 어셈블리가 있다고 가정 할 수 있습니다이 :

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

그런 다음 다른 어셈블리이 :

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

여전히 클래스 A에서 그 방법을 다른 방법으로 얻을 수있는 방법이 있나요 ... 일부는이 문제를 해결합니까? 내가 바로 당신을 가지고 있지만, 당신은 확실히 는 인스턴스 멤버에서 액세스 정적 멤버는 ...하지만 당신이 당신이 인스턴스없이 인스턴스 멤버에 액세스 할 수 없습니다 이해해야 수 new ClassA().GetOrder(orderID);

+1

'GetOrders (..) '를 호출하려면'ClassA'의 인스턴스가 필요합니다.'static'으로 표시되어 있지 않습니다. 대신에 정적 인 것을 의미합니까? –

+0

ClassA는 Singleton입니다. – PositiveGuy

+0

아마도 Singleton을 ClassB의 해당 메서드에 다른 어셈블리에 전달할 수 있습니다. – PositiveGuy

답변

12

시도

+0

정적 멤버를 통해 비 정적 멤버에 액세스하는 방법에 대해 말하고 있습니다 ... 다른 방법으로는 불가능합니다. – PositiveGuy

+0

@coffeeaddict : "non-static"= "인스턴스". 첫 번째 문장은 * 첫 번째 문장에 대한 응답입니다. "인스턴스 멤버에서 정적 멤버에 액세스 할 수없고 그 반대로도 액세스 할 수 없다는 것을 알고 있습니다." 그것은 틀 렸습니다. –

+0

네,이 모든 것을 이해합니다. 나는이 문제를 해결할 대안이 있는지 궁금해했다. ClassA를 정적으로 변경하거나 그 반대로 변경하고 싶지 않습니다. 거대한 리팩터링 문제가 있습니다. – PositiveGuy

4

확실하지.

클래스는 기본적으로 ClassA의 각 인스턴스가 특정 ID와 연결된 주문 목록을 가져올 수 있다고 말합니다. 이제는 ClassA의 인스턴스가 서로 다른 결과를 나타낼 수 있습니다. 예를 들어 서로 다른 데이터베이스에 연결할 수 있습니다. 어떤 결과가 DoSomethingElse에 들어가고 싶습니까?

는, 간단한 예제를 제공 우리가 Person 클래스를 있다고 가정하고, 각 사람의 이름이 있었다하려면 : " Person.Name 무엇입니까"
public class Person 
{ 
    public string Name { get; set; } 
} 

가 물어 말돼을 아니요 - 당신이 말하는 사람을 지정하지 않았기 때문입니다.

ClassA.GetOrders은 가상 회원을 포함하여 인스턴스 별 정보가 포함되지 않은 경우 고정적으로 설정하거나 ClassB이 주문을 찾을 때 ClassA의 인스턴스를 인식하도록 지정해야합니다.

당신이 우리가이 클래스에 대한보다 현실적인 이름을 알려 수 있다면 어떤 해결책이 적합 할 가능성이 높습니다, 우리는 개인적으로 내가 일반적으로 찬성 후자의 접근 방식, 정적 멤버는 일반적으로 이어질 것 ... 지침을 줄 수 테스트 할 수있는 코드가 적습니다.

+0

ClassA는 싱글 톤입니다 ... – PositiveGuy

1

인스턴스 멤버에서 정적 멤버에 액세스 할 수없고 그 반대의 경우도 마찬가지입니다.

실제로 할 수 있습니다. 실제로 인스턴스를 생성하는 데 필요한 다른 방법 (정적의 인스턴스)를 이동하지만

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

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

: 그것은 다른 언어에서 그 의미를 함께

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

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

당신은 혼란 static을 할 수있다.C#에서이 멤버는 클래스의 특정 인스턴스에 바인딩되지 않음을 의미합니다, 당신은 사실상이 같은 위의 예에서 정적 멤버를 호출 할 수 있습니다

MyClass.Foo(); 
0

을 당신이 싱글 인스턴스와 당신에 액세스해야하는 경우 정적 싱글 톤 액세서 (예 : .Instance 또는 .GetInstance())가 없으면 메서드를 호출하기 전에 몇 가지 방법으로 클래스 B에 인스턴스를 삽입 할 수 있습니다 (이 예제에서는 공용 정적 필드를 사용하지만 실제로는 더 안전한 것이 필요합니다) :

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 
    } 
} 

또는 ClassA 인스턴스를 직접 DoSomethingElse에 전달할 수 있습니다. ClassB는 ClassA에 의존하기 때문에 ClassB의 인스턴스를 생성자를 통해 (아마도 자동으로 일부 IoC 프레임 워크와 함께) 삽입 할 수있는 ClassB가 싱글 톤 스타일의 서비스이기도합니다.

관련 문제