我开始使用泛型,并且无法真正地找到简单的初学者指南,所以我只是在做试验和错误。如何在泛型中做到这一点?
我想转换此
public void CreateTask(Task task, Student student)
{
Task convertToUtcTime = task.ConvertToUtcTime(student);
session.Save(convertToUtcTime);
}
public static Task ConvertToUtcTime(this Task task, Student student)
{
if (student != null)
{
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(student.TimeZoneId);
task.DueDate = TimeZoneInfo.ConvertTimeToUtc(task.DueDate, info);
}
return task;
}
是通用
我开始尝试这种(我没有遵守它却又是那么这可能甚至不工作)
public void Create<T>(T entity, Student student)
{
T convertToUtcTime = entity.ConvertToUtcTime(student);
session.Save(convertToUtcTime);
}
public static T ConvertToUtcTime(this T entity, Student student)
{
if (student != null)
{
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(student.TimeZoneId);
entity.DueDate = TimeZoneInfo.ConvertTimeToUtc(entity.DueDate, info);
}
return entity;
}
现在什么混淆了我的错误是我如何投入“实体”的任务对象,但现在只有但我需要转换的其他对象,如约会需要一个时区。
我只是不知道如何让它为我所有不同的对象转换不同的时区。
编辑2
// also used with nhibernate hence why everything is virtual
public class Task :IEntity
{
public virtual int TaskId { get; private set; }
public virtual DateTime DueDate { get; set; }
public virtual Task ConvertToUtcTime2(Student student)
{
DateTime s = DueDate ;
// not use to returning "this" but seems only way how to get the object back.
// I also realized I can do this as well
this.ConvertToUtcTime(Student); // So I am still using my extension method and no need to duplicate that code.
return this;
}
}
public interface IEntity
{
IEntity ConvertToUtcTime2(Student student);
// more methods/properties
}
public void Create<T>(T entity, Student student) where T: IEntity
{
entity.ConvertToUtcTime2(student);
}
// call generic method.
nhibernateRepo.Create(task, student);
@Ed S. - 你能举出更多更完整的例子吗?首先什么是“T:IEntity”?其次是你在不同的接口实现中传递什么?就像说一次我正在传递一个任务,ConverToUtcTime如何处理这个问题?那么下一次我通过DateTime时,它会怎样呢? – chobo2 2011-06-06 01:31:10
“其中”仅仅是泛型类型的限制。这意味着“我只想允许T *类型的T *是一个'IEntity'” – Marlon 2011-06-06 01:33:52
@Marlon - 所以如果我想将任务传递到这个方法中,我不能? – chobo2 2011-06-06 01:34:46