开发者

Invoking a generic method that returns a collection of generics without knowing what the type is? C#

I'm just having a play around with writing an ORM-type project in C#.

Basically, I have a class structure like this:

IDBOperation --- DBReadOperation

DBOperationPool

Basically, a DBReadOperation maps data from the specified database table to a class in my solution, say for example PersonDetails.

The code to do this was taken from an external source (can't quite remember?), and basically returns a generic collection (Collection).

My DBOperationPool needs to be able to take any number of DBReadOperation's and return results for each of them. The logic for that I have down.. but can't seem to get the code to work?

The mapping class also is built on generics.. so how can I instantiate the mapping class to be along the lines of..

MappingClass<?> mappingInstance = new MappingClass<?>();
Collection<?> returnedCollection = mappingInstance.MapData(argument);

How do I (using generics, or reflection, or anythi开发者_如何学运维ng) figure out what to put where the question marks are in the above? Can it be done? I've had a search around and nothing seems to be related to this exact problem..

Obviously, the easy route is making the pool include the type I want to map towards.. but the whole point of the pool is that I can throw DBReadOperation's at it for, say, PersonDetails, CompanyDetails, etc, and have the data mapped to where it needs to be and return the results properly for each type. With this route, I can throw any number of DBReadOperations into a pool, as long as they deal with a specific type for each DBOperationPool instance.. but thats not what I want..

Does this make sense at all?

Regards,

Simon


Make MappingClass implement some interface, IMappingClass, then refer to that everywhere that you don't know what type the generic will hold.

public interface IMappingClass {
   public void DoStuff();
}

public class MappingClass<T> : IMappingClass {
   // stuff
}

// ... elsewhere ...

public void DoMappingStuff(IMappingClass map){
   map.DoStuff();
   // do other stuff...
}

// ...

MappingClass<string> myStringMap = new MappingClass<string>();
DoMappingStuff(myStringMap);

MappingClass<int> myIntMap = new MappingClass<int>();
DoMappingStuff(myIntMap);


Can your DBReadOperation class be generic? Meaning, DBReadOperation<T> and then you instantiate it with:

var dbReadOperation = new DBReadOperation<PersonDetails>();

The MappingClass would take in a DBReadOperation and return a T. It could be used like:

var mapper = new MappingClass<DBReadOperation<PersonDetails>>();
Collection<PersonDetails> collection = mapper.MapData(someArgument);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜