如何将我的方法更改为泛型方法?我的代码有什么问题

本文关键字:我的 代码 泛型方法 什么 问题 方法 | 更新日期: 2023-09-27 18:34:20

我有3个叫做Student,Worker,People的类,可能来自不同的项目。它们都具有两个相同的属性:name,age 。现在当我想把People改成Student的时候,我得写一个叫ChangePeopleToStudent的方法,当我想把People改成Worker的时候,我得写一个叫ChangePeopleToWorker的方法。我尝试使用泛型方法只编写一种方法,但这似乎是错误的。如何解决?

三类

public class  Student
       {
           public string Name { get; set; }
           public int Age { get; set; }
           public int MathPoint { get; set; } 
       }
       public class Worker
       {
           public string Name { get; set; }
           public int Age { get; set; }
           public string WorkPlace { get; set; }
       }
       public class People
       {
           public string Name { get; set; }
           public int Age { get; set; }
           public string Country { get; set; }
       }

我的两个变化方法

 public static Student ChangePeopleToStudent(People people)
       {
           return new Student
           {
               Name = people.Name,
               Age = people.Age
           };
       }
       public static Worker ChangePeopleToWorker(People people)
       {
           return new Worker
           {
               Name = people.Name,
               Age = people.Age
           };
       }

通用方法:如何解决?

public static T ChangePeopleToWorker<T>(People people)
           where T : Student, Worker,new T()
       {
           return new T
           {
               Name = people.Name,
               Age = people.Age
           };
       }

如何将我的方法更改为泛型方法?我的代码有什么问题

创建一个接口(或基类 - 我在我的示例中假设一个接口),例如:

public interface IPerson
{
    string Name { get; set; }
    int Age { get; set; }
}

它应该由所有类实现。然后,您将能够编写:

public static T ChangePersonTo<T>(IPerson person)
where T : IPerson, new T()
{
   return new T
   {
       Name = person.Name,
       Age = person.Age
   };
}
.

NET 不支持多重继承,因此where T : Student, Worker不是一个合理的条件。 如果希望 T StudentWorker则需要定义一个公共基类(或接口),或定义两个不同的方法。

如果People应该是两者之间的公共类,则可以简化类:

   public class  Student : People
   {
       public int MathPoint { get; set; } 
   }
   public class Worker : People
   {
       public string WorkPlace { get; set; }
   }
   public class People
   {
       public string Name { get; set; }
       public int Age { get; set; }
       public string Country { get; set; }
   }