将泛型作为参数传递给DateTime的构造函数

时间:2015-06-23 05:23:49

标签: c# datetime generics calendar

如您所知,PCL不支持PersianCalendar或GregorianCalendar类,所以我使用泛型来实现它,在这种情况下,消费者可以将Calendar传递给类:

public class DateConvertor<TCalendar> where TCalendar : Calendar
{
        public DateConvertor()
        {
            this.CurentCalendar = Activator.CreateInstance<TCalendar>();
        }

        public TCalendar CurentCalendar
        {
            get;
            private set;
        }

        public DateTime GetDate(string date)
        {
            //....
            var newDate = new DateTime(year, month, day, hour, minute, 0);
            return newDate;
        }
}

所以我需要将一个新的PersianCalendar实例传递给DateTime的构造函数:

var newDate = new DateTime(year, month, day, hour, minute, 0, new PersianCalendar()); 

现在我的问题是我该怎么做?例如:

var newDate = new DateTime(year, month, day, hour, minute, 0, CurentCalendar);

我可以将泛型类型作为参数传递给DateTime的构造函数吗?

更新
似乎DateTime类没有那个签名来接受可移植类库中的Calendar的新实例:

public DateTime(
    int year,
    int month,
    int day,
    int hour,
    int minute,
    int second,
    Calendar calendar
)

1 个答案:

答案 0 :(得分:2)

正如您所指出的,DateTime在PCL中没有您想要的构造函数。但是,您可以使用Calendar.ToDateTime

return CurrentCalendar.ToDateTime(year, month, day, hour, minute, 0, 0);

顺便说一句,您可以更改通用约束以包含new(),并只调用构造函数:

public class DateConverter<TCalendar> where TCalendar : Calendar, new()
{
    public DateConverter()
    {
        this.CurrentCalendar = new TCalendar();
    }
}

或者以更愉快的方式使用支持其他日历的Noda Time项目,IMO - 例如一个LocalDateTime&#34;知道&#34;它所属的日历,并允许您转换为另一个日历中的LocalDateTime等。