Wie könnte ich folgende Problematik umgehen?



  • Datenquelle:

    //Schnittstelle für eine Datenquelle

    interface IDataSource<TSource>
    	{
    		TSource GetCurrentDatabase();
    
    		void CreateNewDatabase();
    
    		TSource[] GetQuerySources(DateTime from, DateTime to);
    	}
    
    //Foo als Implementaion der Datenquelle
    class Foo :  IDataSource<OleDbConnection>
    	{		
    	}
    

    Der datenquellen Manager gibt aktuelle Quelle zurück etc.:

    class DataSourceManager
    	{
    		public DataSourceManager(
    			IDataSource<TSource> source)
    		{
    			_source = source;
    		}
    		private IDataSource<TSource> _source;
    	}
    

    bei der instanierung der DateSourceManager wird folgender fehler angeigt

    DataSourceManager xx = new DataSourceManager(new Foo());
    

    Fehler 1 Die Typargumente der AccessEventLogging.DataSourceManager.DataSourceManager(AccessEventLogging.IDataSource<TSource>)-Methode können nicht per Rückschluss aus der Syntax abgeleitet werden. Geben Sie die Typargumente explizit an. C:\Documents and Settings\Operator\My Documents\Visual Studio 2008\Projects\3D_Projecte\FormatTEst\AccessEventLogging\Program.cs 96 27 AccessEventLogging

    Wie mach ich das besser, bzw. wie bekomm ich den fehler weg... was meine Intension der Konstruktion ist , ist glaub ich erkennbar



  • Das Problem wird folgendes sein:

    class DataSourceManager
        {
            public DataSourceManager(
                IDataSource<TSource> source) //<---TSource
            {
                _source = source;
            }
            private IDataSource<TSource> _source;
        }
    

    Der Ctor ist einfach nicht eindeutig, du musst ihm da schon eine eindeutige IDataSource übergeben.



  • Willst du ein generisches Interface in einer Liste benutzen, musst du das Interface splitten in ein Generisches und ein Nicht-Generisches Interface.
    Also wird aus:

    interface IDataSource<TSource>
        {
            TSource GetCurrentDatabase();
    
            void CreateNewDatabase();
    
            TSource[] GetQuerySources(DateTime from, DateTime to);
        }
    

    das hier

    interface IDataSource
    {
        void CreateNewDatabase();
    }
    
    interface IDataSource<TSource> : IDataSource
    {
        TSource GetCurrentDatabase();
    
        TSource[] GetQuerySources(DateTime from, DateTime to);
    }
    

    in deinem Fall sollte es aber reichen wenn du den DataSourceManager Generisch machst. Vielleicht wär hier sogar ein Singleton angebracht, weiss aber gerade nicht in wie fern die Instanz benutzt wird.


Anmelden zum Antworten