如何在泛型中做到这一点?

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)

Ed *_* S. 9

如果要访问第一个参数的属性或方法,则需要使用通用接口.无论如何,您不希望在通用方法内部进行转换.如果这些实体派生自公共基类或实现公共接口,则可以使用通用约束并完成它们:

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)