c# - How can I call a generic method on an injected class without informing the parent class of the generic type? -
c# - How can I call a generic method on an injected class without informing the parent class of the generic type? -
below implementation of dependency injected class.
public class csvdataprovider : icsvdataprovider { readonly icsvreaderfactory _factory; public csvdataprovider(icsvreaderfactory factory) { _factory = factory; } public ienumerable<trecord> getdata<trecord>(string filepath) trecord : class { var reader = _factory.createcsvreader(filepath); homecoming reader.getrecords<trecord>(); } } the reader created factory read lines in csv file , convert each line instance of trecord. not own reader code , can not alter getrecords<trecord>() method.
this stuck:
public class csvdatamigrationcontroller { readonly icsvdataprovider _provider; readonly icsvdatamigration _migration; public csvdatamigrationcontroller(icsvdataprovider provider, icsvdatamigration migration) { _provider = provider; _migration = migration; } public void processfile(string path) { var records = _provider.getdata<i_dont_want_to_explicitly_say>(path); //<-- help! _migration.migrate(records); } } the intent inject info provider , migration procedure class csvdatamigrationcontroller. controller phone call info provider info , pass info migration class.
csvdatamigrationcontroller know type of info involved. i don't want csvdataprovider know migration. i don't want csvdatamigration know info came from. any advice on how can accomplish this?
note: did not include csvdatamigration class because didn't think useful in explanation, include if needed.
well, since can't alter getrecords, perhaps straightforward way inquire migration interface record type, , utilize reflection phone call generic getdata method runtime-obtained type. like:
public void processfile(string path) { type recordtype = _migration.inputrecordtype; var getdatamethod = _provider.gettype() .getmethod("getdata") .makegenericmethod(recordtype); var records = getdatamethod.invoke(_provider, new object[] { path }); _migration.migrate(records); } c# .net generics interface dependency-injection
Comments
Post a Comment