cho*_*bo2 0 c# generics c#-4.0
我开始使用泛型,并且无法真正找到简单的初学者指南,所以我只是在做试验和错误.
我想转换它
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;
}
Run Code Online (Sandbox Code Playgroud)
是通用的
我开始尝试这个(我还没有遵守它,所以这可能不起作用)
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;
}
Run Code Online (Sandbox Code Playgroud)
现在什么混淆了赫克我的是我怎么投"实体"的任务目标,但现在只有这一点,但我需要那样需要一个时区的约会转换的其他对象.
我只是无法弄清楚如何让它为我所有不同的对象转换不同的时区.
编辑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);
Run Code Online (Sandbox Code Playgroud)
如果要访问第一个参数的属性或方法,则需要使用通用接口.无论如何,您不希望在通用方法内部进行转换.如果这些实体派生自公共基类或实现公共接口,则可以使用通用约束并完成它们:
public interface IEntity
{
IEntity ConvertToUtcTime(Student);
// more methods/properties
}
public void CreateTask<T>(T entity, Student student) where T : IEntity
{
T convertToUtcTime = entity.ConvertToUtcTime(student);
session.Save(convertToUtcTime);
}
Run Code Online (Sandbox Code Playgroud)