Yes it does. I'll have to consider that.

Here is what I'm essentially going for.

// client side:
List<Report> detailByDateReports = 
provider.GetReports<DetailByDateReport>(criteria);
foreach (DetailByDateReport rpt in detailByDateReports)
     // do something

// the provider class, data layer
    public class ReportProviderSql : IReportProvider
    {
        private static Dictionary<Type, Func<ReportCriteria, 
IList<ReportType>>> _reportFunctions = null;
        private static object _syncLock = new object();
        public ReportProviderSql()
        {
            if (_reportFunctions == null)
            {
                lock(_syncLock)
                {
                    if (_reportFunctions == null)
                    {
                        _reportFunctions = new 
Dictionary<Type,Func<ReportCriteria,IList<ReportType>>>();
                        _reportFunctions.Add(typeof(DetailByDateReportType), 
GetDetailByDate);
                    }
                }
            }
        }
        #region IReportProvider Members
        public IList<T> GetReport<T>(ReportCriteria criteria) where T : 
ReportType
        {
            Type t = typeof(T);
            if (_reportFunctions.ContainsKey(t))
            {
                return _reportFunctions[t].Invoke(criteria) as IList<T>;
            }
            return null;
        }
        #endregion
        private static IList<ReportType> GetDetailByDate(ReportCriteria 
criteria)
        {
            List<ReportType> resultset = new List<ReportType>();

            ReportsDataContext db = new ReportsDataContext();

            var query = db.proc_RptDetailByDate(criteria.StartDate,
                criteria.EndDate, criteria.EmployeeID, criteria.ProjectID);

            foreach (var item in query)
            {
                DetailByDateReportType rpt = new DetailByDateReportType();
                rpt.Employee = item.Employee;
                rpt.Project = item.Project;
                rpt.Date = item.Date;
                rpt.Comments = item.Comments;
                rpt.Time = item.Time;
                rpt.Duration = item.Duration ?? 0.0M;
                resultset.Add(rpt);
            }

            db.Dispose();

            return resultset;
        }
    }

________________________________________
From: Discussion of advanced .NET topics. [EMAIL PROTECTED] On Behalf Of Bob 
Provencher [EMAIL PROTECTED]
Sent: Friday, December 14, 2007 12:58 PM
To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
Subject: Re: [ADVANCED-DOTNET] Method that returns List<BaseClass>

I think if someone puts a Report in your list, which it's type implies is
allowed, your foreach will throw an invalid cast exception.

-----Original Message-----
From: Discussion of advanced .NET topics.
[mailto:[EMAIL PROTECTED] On Behalf Of Ron Young
Sent: Friday, December 14, 2007 1:46 PM
To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
Subject: Re: [ADVANCED-DOTNET] Method that returns List<BaseClass>

Indeed it does. Thank you.

I was under the impression that if the method that returned derived reports
ultimately returned a list of the base report, then the client would get the
properties defined in the base report.

But it's up to the client to determine what types of reports are in the
list, so this works:

// client-side
List<Report> reports = provider.GetReports();
foreach (ReportA item in reports)
    WL(item.MyName);

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to