------自定义泛型类的问题???

txt_ly 2007-09-24 09:40:27
public class sort<T>
{
private string m_colName;//<T>排序属性名
public sort(string colName)
{
m_colName = colName;
}
//用来给List<T>排序
public static int CompareCols(T x, T y)
{
if (x == null)
{
if (y == null)
{
return 0;
}
else
{
return -1;
}
}
else
{
if (y == null)
{
return 1;
}
else
{
return x.m_colName.CompareTo(y.m_colName);//这句话出了问题错误 17 “T”并不包含“m_colName”的定义

}
}
}
}

有什么好的方法吗??
...全文
914 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiaoWu 2008-01-23
  • 打赏
  • 举报
回复
非常好!
ezhuyin 2007-09-24
  • 打赏
  • 举报
回复
如果要使用自定义属性进行比较,就要让传入的类实现某个接口。
public interface IMyClass
{
m_colName
{
get;
set;
}
}

public class sort<T>
{
public static int CompareCols(T x, T y)
where T :IMyClass
{
// 你的方法
}
}

// 可传入的类
public class MyClass : IMyClass
{
private string m_colname;
public string m_colName
{
get {return m_colname;}
set {m_colname=value;}
}
}
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
public sort(string colName)
{
m_colName = colName;
}
根据传入的属性名对List<T>排序
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
to hdt(倦怠)
interface ia {
string col_name { get; set;}
}
col_name是确定的吗,我要实现的是动态的
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
我试试hdt(倦怠)的方法
lnwuyaowei 2007-09-24
  • 打赏
  • 举报
回复
除非你知道这个传入的东西是什么,否则是不能实现的,如果对一个未知元素可以在泛型中排序,微软早就实现这个功能了。

一个可以选择的方法是:

定义一个接口,接口中定义了排序字段,其它的类实现这个接口,在sort类中对接口排序。

这样做,其实也是建立在你清楚要对什么排序的基础之上。
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
to lnwuyaowei(风可以追我) 我想实现一个可以根据传入属性名对List<T>排序的公用类
lnwuyaowei 2007-09-24
  • 打赏
  • 举报
回复
另外,如果说通用泛型排序,除了反射(这个方法是不是真的具有实用性还值得探讨),在vs2008中,可以用linq语法查询进行,这种方法应当可以说是非常好的解决方法。
lnwuyaowei 2007-09-24
  • 打赏
  • 举报
回复
public static int CompareCols(T x, T y)
这里T的类型未知,所以出错。

排序的关键在于比较,所以要求被排序的类要实现IComparable接口

如:class Racer:IComparable
{
private string _name;

public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;

public int Age
{
get { return _age; }
set { _age = value; }
}
public Racer(string name,int age)
{
this._name = name;
this._age = age;
}

#region IComparable 成员

public int CompareTo(object obj)
{
Racer temp = (Racer)obj;

return this._name.CompareTo(temp._name);
}

#endregion
}
排序时用:
List<Racer> racers = new List<Racer>();

racers.Add(new Racer("aaaa",12));
racers.Add(new Racer("ddddd",15));
racers.Add(new Racer("bbb",3));

racers.Sort();

dataGridView1.DataSource = racers;



http://bbs.gogolike.com/showtopic-476.aspx
chuxue1342 2007-09-24
  • 打赏
  • 举报
回复
MARK!
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
楼上的,我要根据 <T>里的属性
return x.m_colName.CompareTo(y.m_colName);//这句话出了问题错误 17 “T”并不包含“m_colName”的定义
真相重于对错 2007-09-24
  • 打赏
  • 举报
回复
interface ia {
string col_name { get; set;}
}
class myc<T> where T:ia
{
void youmethod( T x )
{
x.col_name = ...

}
}
绝代坏坏 2007-09-24
  • 打赏
  • 举报
回复
ojekleen(三尾) ( ) 信誉:100 2007-09-24 09:50:04 得分: 0


public class sort<T>
{
private T m_colName;//<T>排序属性名
public sort(T colName)
{
m_colName = colName;
}


-----------------------------------------------------
正解
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
to ojekleen(三尾) 这样写是不行的,我是要取<T>里的属性

to hdt(倦怠) 能给点代码吗??反射是可行
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
能给点代码吗??
ojekleen 2007-09-24
  • 打赏
  • 举报
回复
public class sort<T>
{
private T m_colName;//<T>排序属性名
public sort(T colName)
{
m_colName = colName;
}
真相重于对错 2007-09-24
  • 打赏
  • 举报
回复
反射或者用接口限制
txt_ly 2007-09-24
  • 打赏
  • 举报
回复
自己顶一下
txt_ly 2007-09-24
  • 打赏
  • 举报
回复

多谢大家!!!~~~
多谢 danjiewu(阿丹)强力支援
idot 2007-09-24
  • 打赏
  • 举报
回复
定义一个包含m_colName属性的基类或接口(暂命名为H),然后在将源码里将所有用到的T替换为H,这样要比你用范型类好。
加载更多回复(23)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧