I create it like this at the moment if(some condition) XLToList(MyClass) xlist = new XLToList(MyClass)(); else XLToList(MyOtherClass) xlist2 = new XLToList(MyOtherClass)(); public class XlToList(T) where T : ITariffDataImport, new() { public delegate void Notify(object sender, CSVEventargs e); public delegate void NotifyEveryRecord(int RecordNumber); public event Notify OnFinishedProcessing; public event Notify OnFoundBadTariff; public event Notify OnFoundStartingRow; public event NotifyEveryRecord OnProcessingRecords; private Type thistype = typeof(T); private List(T) data; public List(T) Data { get { return data; } set { data = value; } }and the class uses T to create types and class instances etc... any clearer ? ( sorry I've used parentheses instead of angle brackets because of the UT limitations.)