/// <summary>
/// 年龄升序
/// </summary>
public class AgeSort : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.StdBorn.CompareTo(y.StdBorn);
}
}
/// <summary>
/// 年龄倒序
/// </summary>
public class AgeDescSort : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return y.StdBorn.CompareTo(x.StdBorn);
}
}
/// <summary>
/// 姓名升序
/// </summary>
public class NameSort:IComparer<Student>
{ public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
}
/// <summary>
/// 工厂类
/// </summary>
public class Factory
{
public static IComparer<Student> StuSort(string sortType)
{
return Assembly.GetAssembly(typeof(Factory)).CreateInstance("ConsoleApplication2."+sortType) as IComparer<Student>;
}
}
/// <summary>
/// 学生类
/// </summary>
public class Student : IComparable<Student>
{
//学号
public int stdId { get; set; }
//姓名
public string Name { get; set; }
//座位号
public int SeatNo { get; set; }
//出生日期
public DateTime StdBorn { get; set; }
public int CompareTo(Student other)
{
return this.stdId.CompareTo(other.stdId);
}
}
class Program
{
static void Main(string[] args)
{ List<Student> stuList = new List<Student>()
{
new Student{stdId=4,Name="b",SeatNo=2,StdBorn=new DateTime(1991,1,1)},
new Student{stdId=3,Name="c",SeatNo=3,StdBorn=new DateTime(1993,1,1)},
new Student{stdId=2,Name="d",SeatNo=4,StdBorn=new DateTime(1994,1,1)},
new Student{stdId=1,Name="a",SeatNo=1,StdBorn=new DateTime(1992,1,1)},
}; stuList.Sort(Factory.StuSort("AgeSort")); for (int i = 0; i < stuList.Count; i++)
{
Console.WriteLine(stuList[i].stdId+"\t"+stuList[i].Name+"\t"+stuList[i].SeatNo+"\t"+stuList[i].StdBorn);
} Console.WriteLine();
stuList.Sort(Factory.StuSort("NameSort")); for (int i = 0; i < stuList.Count; i++)
{
Console.WriteLine(stuList[i].stdId + "\t" + stuList[i].Name + "\t" + stuList[i].SeatNo + "\t" + stuList[i].StdBorn);
}
}
}
以上是代码,stuList.Sort(Factory.StuSort("NameSort"));我调用工厂类的方法使却不走那个对象内部的方法,反而走Student类的方法,每次排序结束都是stdID顺序,很是苦恼,求好心朋友相助
/// 年龄升序
/// </summary>
public class AgeSort : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.StdBorn.CompareTo(y.StdBorn);
}
}
/// <summary>
/// 年龄倒序
/// </summary>
public class AgeDescSort : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return y.StdBorn.CompareTo(x.StdBorn);
}
}
/// <summary>
/// 姓名升序
/// </summary>
public class NameSort:IComparer<Student>
{ public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
}
/// <summary>
/// 工厂类
/// </summary>
public class Factory
{
public static IComparer<Student> StuSort(string sortType)
{
return Assembly.GetAssembly(typeof(Factory)).CreateInstance("ConsoleApplication2."+sortType) as IComparer<Student>;
}
}
/// <summary>
/// 学生类
/// </summary>
public class Student : IComparable<Student>
{
//学号
public int stdId { get; set; }
//姓名
public string Name { get; set; }
//座位号
public int SeatNo { get; set; }
//出生日期
public DateTime StdBorn { get; set; }
public int CompareTo(Student other)
{
return this.stdId.CompareTo(other.stdId);
}
}
class Program
{
static void Main(string[] args)
{ List<Student> stuList = new List<Student>()
{
new Student{stdId=4,Name="b",SeatNo=2,StdBorn=new DateTime(1991,1,1)},
new Student{stdId=3,Name="c",SeatNo=3,StdBorn=new DateTime(1993,1,1)},
new Student{stdId=2,Name="d",SeatNo=4,StdBorn=new DateTime(1994,1,1)},
new Student{stdId=1,Name="a",SeatNo=1,StdBorn=new DateTime(1992,1,1)},
}; stuList.Sort(Factory.StuSort("AgeSort")); for (int i = 0; i < stuList.Count; i++)
{
Console.WriteLine(stuList[i].stdId+"\t"+stuList[i].Name+"\t"+stuList[i].SeatNo+"\t"+stuList[i].StdBorn);
} Console.WriteLine();
stuList.Sort(Factory.StuSort("NameSort")); for (int i = 0; i < stuList.Count; i++)
{
Console.WriteLine(stuList[i].stdId + "\t" + stuList[i].Name + "\t" + stuList[i].SeatNo + "\t" + stuList[i].StdBorn);
}
}
}
以上是代码,stuList.Sort(Factory.StuSort("NameSort"));我调用工厂类的方法使却不走那个对象内部的方法,反而走Student类的方法,每次排序结束都是stdID顺序,很是苦恼,求好心朋友相助
这行改成两行
object obj = Assembly.GetAssembly(typeof(Factory)).CreateInstance("ConsoleApplication2." + sortType);
return obj as IComparer<Student>;
第一行设置断点,单步执行下去,看 obj 是不是 null,如果是,检查下 ConsoleApplication2 是不是 AgeSort 所在的命名空间
4 b 2 1991-1-1 0:00:00
1 a 1 1992-1-1 0:00:00
3 c 3 1993-1-1 0:00:00
2 d 4 1994-1-1 0:00:001 a 1 1992-1-1 0:00:00
4 b 2 1991-1-1 0:00:00
3 c 3 1993-1-1 0:00:00
2 d 4 1994-1-1 0:00:00
我怎么没修改,答案就是正确的?
return Assembly.GetAssembly(typeof(Factory)).CreateInstance("ConsoleApplication2."+sortType) as IComparer<Student>;这个ConsoleApplication2修改为自己的命名空间ConsoleApplication1