3

에 값을 가지고 여기 내 수업 ManagersAccessPoint은 관리자에 열거에서 매핑하는 사전도 있어야템플릿 Abtract 클래스는 사전

Abstract Class - AbstractManager<T> 
Class - SettingsManager : AbstractManager<Settings> 
Class - Settings 
Class - LoginManager : AbstractManager<Login> 
Class - Login 
Enum - Managers 
Class - ManagersAccessPoint 

있습니다.

_dict : Dictionary<Managers, AbstractManager<T>> 

문제는 설정이나 로그인에 ManagersAccessPoint를 템플릿으로 지정하지 않기를 바랍니다. 나는

_dict : Dictionary<Managers, AbstractManager> 

내가 필요한 것 '둘 다에 있고' '투명하게'를 사용하고자하지만, 그 작성 확인하지 않습니다.

어떻게해야합니까?

+4

* AbstractManager * 인터페이스/기본 클래스가 없기 때문에. 당신은 Generotype 타입을 가지고 있습니다 * AbstractManager * (부수적으로, 템플릿이 아닙니다, Generic입니다) 그리고 구체적인 타입들 * AbstractManager *와 * AbstractManager *은 서로 타입 변환 할 수 없습니다. * AbstractManager * 인터페이스를 만들고 * AbstractManager *이 해당 인터페이스에서 파생되도록하십시오. 예를 들어 * ICollection *을 구현하는 * System.Collections.Generic.List *을 살펴보면 * IEnumerable *) – elgonzo

+0

나는 곧 그걸 시험해보고 그것이 내 필요에 맞는지 보겠다. 고맙다. – Fawar

+0

@elgonzo 그것은 대단한 대답이다. 그것을 게시하십시오. –

답변

0

지정된 엔티티 유형에 대한 관리자 가져 오기에 열거하고 초점을 맞추는 스크랩.

귀하의 문제는 기본 클래스가 입력된다는 것입니다. 즉, 일반 목록에 추가하는 것은 불가능합니다 (입력되지 않았으므로). 그러므로 당신이해야 할 일은 요청을 할 때 그것을 객체 목록에 넣고 올바른 유형으로 캐스팅하는 것입니다.

public class ManagersAccessPoint 
{ 
    private Dictionary<Type, object> _items : Dictionary<Type, object>(); 

    public void Register<TEntity>(AbstractManager<TEntity> manager) 
    { 
     _items[typeof(TEntity)] = manager; 
    } 

    public AbstractManager<TEntity> Get<TEntity>() 
    { 
     return (AbstractManager<TEntity>)_items[typeof(TEntity)]; 
    } 
} 

위에서 알 수 있듯이 구현 내에서 아무 것도 입력되지 않습니다.

예 :

비록 열거하지
//registration 
var accessPoint = new ManagersAccessPoint(); 
accessPoint.Register(new SettingsManager()); 
accessPoint.Register(new LoginManager()); 


//usage 
var manager = accessPoint.Get<Login>(); 
manager.blabla(); 

실제 구현 및 관리 엔티티 자체 사이에 연결이 존재하지 않는다.

관련 문제