Generic object to object mapping with parametrized constructor
- by Rody van Sambeek
I have a data access layer which returns an IDataRecord.
I have a WCF service that serves DataContracts (dto's). These DataContracts are initiated by a parametrized constructor containing the IDataRecord as follows:
[DataContract]
public class DataContractItem
{
[DataMember]
public int ID;
[DataMember]
public string Title;
public DataContractItem(IDataRecord record)
{
this.ID = Convert.ToInt32(record["ID"]);
this.Title = record["title"].ToString();
}
}
Unfortanately I can't change the DAL, so I'm obliged to work with the IDataRecord as input. But in generat this works very well. The mappings are pretty simple most of the time, sometimes they are a bit more complex, but no rocket science.
However, now I'd like to be able to use generics to instantiate the different DataContracts to simplify the WCF service methods. I want to be able to do something like:
public T DoSomething<T>(IDataRecord record) {
...
return new T(record);
}
So I'd tried to following solutions:
Use a generic typed interface with a constructor.
doesn't work: ofcourse we can't define a constructor in an interface
Use a static method to instantiate the DataContract and create a typed interface containing this static method.
doesn't work: ofcourse we can't define a static method in an interface
Use a generic typed interface containing the new() constraint
doesn't work: new() constraint cannot contain a parameter (the IDataRecord)
Using a factory object to perform the mapping based on the DataContract Type.
does work, but: not very clean, because I now have a switch statement with all mappings in one file.
I can't find a real clean solution for this. Can somebody shed a light on this for me?
The project is too small for any complex mapping techniques and too large for a "switch-based" factory implementation.