2010-07-26 1 views
0

처음에는 정말 나쁜 제목입니다.C# Bestpractice : 클래스 자체의 일부인 메서드 매개 변수의 depdency에 값을 반환하는 메서드 작성

public class Config 
{ 
    public Provider1 Provider1 { get; set; } 
    public Provider2 Provider2 { get; set; } 
    public Provider3 Provider3 { get; set; } 
    public Provider4 Provider4 { get; set; } 
    public Provider5 Provider5 { get; set; } 

    public int GetNumber(string provider) 
    { 
     ... 
    } 
} 

각 공급자가 수 속성이 있습니다 : 당신이 더 나은 제목이있는 경우 단지

나는이 클래스가) = 변경하거나 주석을 공급자의 의존성에서

public interface IProvider 
{ 
    int Number{ get; set; } 
} 

제공자 번호를 반환하고 싶습니다.

어떻게 하시겠습니까?

큰 스위치 블록을 사용하고 싶지 않습니다.

답변

4
public interface IProvider 
{ 
    int Number {get;set;} 
} 

public class Config 
{ 
    public int GetNumber<T>() where T : IProvider 
    { 
     // code to find the provider you want 
     IProvider foundProvider = ProviderFactoryMethodHere(typeof(T)); 

     return foundProvider.Number; 
    } 
} 

의 클래스에이 방법 공급자의 모든 클래스는 IProvider 인터페이스를 구현해야하고 당신은 당신이 주어진에 올바른 제공자를 반환하는 공장을 구현해야 일반 메소드에서 요청한 유형.

// Test code example 
Config configImpl = new Config(); 
int numberOfProvider = configImpl.GetNumber<Provider1>(); 
Assert.Equal(1, numberOfProvider); 

간단한 ProviderFactoryMethod 예제를 추가하겠습니다. 형식을 매개 변수로 전달하는 대신이 메서드를 일반화 할 수도 있지만이 예제는 그대로 두겠습니다.

public IProvider ProviderFactoryMethodHere(Type providerRequested) 
{ 
    Dictionary <Type, IProvider> providerDict; 
    if (providerDict == null) 
    { 
     // populate dictionary with providers, keyed by their type 
     providerDict = new Dictionary<Type, IProvider>(); 
     providerDict.Add(typeof(Provider1), new Provider1()); 

     // repeat for all providers, this is pretty simple but definitely works 
     // we could use other ways of holding on to your provider instances 
    } 
    if (providerDict.HasKey(providerRequested)) 
    { 
     return providerDict[providerRequested]; 
    } 
    // could throw exception here if you want to use that kind of error 
    // handling, but we'll just return null for now 
    return null; 
} 

건배.

+0

어, 공장은 어떻게 생겼습니까? Btw. GetNumber는 generic 일 수 없습니다 ... 공급자는 문자열 매개 변수로 전달되어야합니다. – Rookian

+0

switch 문을 공장으로 밀어 넣는 것처럼 보입니다. –

+0

@Rookian - "문자열"매핑 값을 의도적으로 제거했습니다. 요구 사항에서 지금까지 설명 된 것처럼 필요하지 않기 때문입니다. 제네릭에 익숙하지 않고 유형을 직접 사용하여 찾고있는 것을 "발견"하는 사람들에게는 매우 일반적입니다. 문제 코드의보다 정교한 사용법은 실제로 문자열이 필요한지 여부를 보여줍니다. 문자열이 어떻게 보이는지 보여주고 문자열이 필요한 이유를 설명 할 수 있습니까? –

0

공급자의 번호는 모든 공급자가 구현하는 기본 클래스 또는 인터페이스의 속성입니까, 아니면 구성 클래스의 위치 속성입니까?

편집

는 공급자의 속성, 그것은 공급자 통해 액세스 할 수있는 다음 올바른 방법이 있다면. 즉, Config은 의 하위 항목을 반환해야하며 호출자는 Number 속성에 연결할 수 있습니다.

편집 문제의

부분은 속성 이름을 열거 한 것을 ("prop1", "prop2"등)입니다. 인덱스를 사용하는 인덱서 또는 메서드로 바꾸지 않는 이유는 무엇입니까?

또 다른 문제는 공급자 이름으로 Number을 조회하고 싶지만 이름이있는 곳이 표시되지 않는 것입니다. 수업 이름 이니?

+0

대답이 아닌 – Rookian

+0

인터페이스를 상속하는 공급자의 속성이므로 대신 질문에 대한 설명을 작성하십시오. – Blub

+0

@Blub : 더 나은 아직, 나는 대답 해 줄게. –

0

인터페이스를 만듭니다.

IGiveANumberbackbackable { GetNumber(); }

클래스에서 구현하십시오.

전화 이제 대신 GetNumber()

+0

그래서'IProvider.GetNumber'를 호출하는 대신에'IGiveANumberbackable.GetNumber'를 호출하고 싶습니까? 또는 나는 무엇인가 놓치고 있냐? – Patrick

1

이상적으로 모든 Provider가 각각의 Number를 제공하는 단일 기본 클래스 (또는 인터페이스)로부터 상속 받기를 원합니다.

그런 다음 사용중인 문자열에 상관없이 모든 제공자를 해시 테이블에 덤프 할 수 있습니다. 예를 들면 다음과 같습니다.

public class Config 
{ 
    Dictionary<string, Provider> _providers = new Dictionary<string, Provider>(); 

    // .. all of your providers .. 

    public int GetNumber(string provider) 
    { 
     if (!_providers.HasKey(provider)) 
     throw ArgumentException(); 
     return _providers[provider].Number; 
    } 
} 
+0

공통 인터페이스 대신 공통베이스를 사용하는 대신, 이름을 기반으로하는 공급자를 반환하는 대신 특수한 경우에 'Number' 속성을 사용하려는 이유는 무엇입니까? –

+0

그것이 OP가 요구 한 것이기 때문에? – ladenedge

2

공급자를 식별하는 문자열을 사용하여 사전에 추가하십시오.

IDictionary<string, IProvider> providers = new Dictionary<string, IProvider>(); 

그러면 사전에 GetNumber 메서드에 전달 된 값이 들어 있는지 확인하여 사전에서 값을 가져올 수 있습니다. 거기에 있다면 사전에서 빼내서 공급자의 Number 속성을 호출하면됩니다. 당신이 사전을 정의 할 때, IProvider 모든 공급자가 상속 기본 클래스가 될 필요가

return providers[provider].Number;

참고.

+0

예, 이것이 해당 인덱서를 구현하는 올바른 방법 일 것입니다. –

관련 문제