using System;
using System.Collections; namespace test
{
public interface IColumn
{ object Value
{
get;
}
} public class IntColumn : IColumn
{
int value;
public object Value
{
get { return (object)this.value; }
} public IntColumn(int value)
{
this.value = value;
}
} public class BoolColumn : IColumn
{
bool value;
public object Value
{
get { return (object)this.value; }
} public BoolColumn(bool value)
{
this.value = value;
}
} public class StringColumn : IColumn
{
string value;
public object Value
{
get { return (object)this.value; }
} public StringColumn(string value)
{
this.value = value;
}
}
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(123));
list.Add(new StringColumn("abc")); foreach(object col in list)
{
Console.WriteLine((col as IColumn).Value);
}
}
}
}
using System.Collections; namespace test
{
public interface IColumn
{ object Value
{
get;
}
} public class IntColumn : IColumn
{
int value;
public object Value
{
get { return (object)this.value; }
} public IntColumn(int value)
{
this.value = value;
}
} public class BoolColumn : IColumn
{
bool value;
public object Value
{
get { return (object)this.value; }
} public BoolColumn(bool value)
{
this.value = value;
}
} public class StringColumn : IColumn
{
string value;
public object Value
{
get { return (object)this.value; }
} public StringColumn(string value)
{
this.value = value;
}
}
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(123));
list.Add(new StringColumn("abc")); foreach(object col in list)
{
Console.WriteLine((col as IColumn).Value);
}
}
}
}
解决方案 »
- 初学C#,写了个串口调试软件,有兴趣的看下
- 模糊查询
- 一个odbcconnection 的问题
- 【100分求助】从 IClassFactory 为 CLSID 为 {0002DF01-0000-0000-C000-000000000046}
- 做毕业设计,哪里能找到关于.NET的文献,最好有中英文
- GridView导出EXCLE表,因为从OFFICE2003 升级到office 2010而出错?
- 能否给用户控件添加一个事件?高手请进!!!
- 求助:datagrid出现System.ArgumentException
- IE控件的"查找"功能出错,具体内详...
- 欢迎高手进来讨论--怎样利用软路由?
- 字符串变量的问题.
- 谢谢,HI,请教一个问题,Winform程序,我用资源文件做多语言,现在我遇到一个问题,当子窗口已经打开时,这时切换语言,子窗口的语言不变,这怎么解决
但不知道有没有这种轮询的方法。
using System.Collections; namespace test
{
public class Column <T>
{
private T value; public T Value
{
get { return this.value; }
set { this.value = value; }
}
public override string ToString()
{
return value.ToString();
}
} public class IntColumn : Column <int>
{
public IntColumn(int value)
{
this.Value = value;
}
} public class BoolColumn : Column <bool>
{
public BoolColumn(bool value)
{
this.Value = value;
}
} public class StringColumn : Column <string>
{
public StringColumn(string value)
{
this.Value = value;
}
}
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(123));
list.Add(new StringColumn("abc")); foreach(object col in list)
{
Console.WriteLine(col);
} }
}
}
/*
程序输出:
True
123
abc
*/
public class ObjectColumn : Column<object>
{
}
public class IntColumn :ObjectColumn
{
public IntColumn(int value)
{
this.Value = value;
}
} public class BoolColumn : ObjectColumn
{
public BoolColumn(bool value)
{
this.Value = value;
}
} public class StringColumn : ObjectColumn
{
public StringColumn(string value)
{
this.Value = value;
}
}。。foreach (ObjectColumn col in list)
但我Foreach里并不一定只访问ToString()
我说了用object会增加对象转换成本,如果小量用OK,但底层用要承载大量数据的话就不好。
0楼ArrayList list = new ArrayList();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(0));
list.Add(new StringColumn("abc"));
4楼
2楼的方法我会,但我不想使用object,因为会增加对象转换成本,泛型就不会。
但不知道有没有这种轮询的方法。9楼
7楼,如果value不用object类型,怎么处理?
我说了用object会增加对象转换成本,如果小量用OK,但底层用要承载大量数据的话就不好。
======================================================================自己在用object,还不许别人用,典型的"只许州官放火,不许百姓点灯"啊!!!
我并不是说都不用Object,ArrayList里面装的是什么我还是清楚的。
我想过别的方法实现。
using System.Collections; namespace test
{
public interface IColumn
{ object Value
{
get;
}
} public class IntColumn : IColumn
{
int value;
public object Value
{
get { return (object)this.value; }
} public IntColumn(int value)
{
this.value = value;
}
} public class BoolColumn : IColumn
{
bool value;
public object Value
{
get { return (object)this.value; }
} public BoolColumn(bool value)
{
this.value = value;
}
} public class StringColumn : IColumn
{
string value;
public object Value
{
get { return (object)this.value; }
} public StringColumn(string value)
{
this.value = value;
}
}
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(123));
list.Add(new StringColumn("abc")); foreach (IColumn col in list)
{
Console.WriteLine(col.Value);
}
}
}
} foreach (IColumn col in list)不用 object ,这样可以了?
{
static void Main()
{
List<IColumn> list = new List<IColumn>();
list.Add(new BoolColumn(true));
list.Add(new IntColumn(-5123));
list.Add(new StringColumn("abc")); foreach (IColumn col in list)
{
Console.WriteLine(col.Value);
}
}
}其实应该用 System.Collections.Generic.List 而不是 System.Collections.ArrayList
所以Column<T> 是一个模版,而Column<int> Column<bool> Column<string>是其经过JIT编译时创建的三种不同的类型,其区别就如同int bool 和 string。你的问题相当于如何轮询 int bool 和 string混杂的集合。这个当然通过基类或基接口来实现。楼上的程序都是正解,否则你如何定义一个固定类型的变量接收从集合里取出的不同类型的变量?
你盲目的认定不合适,是中了微软的毒,认为泛型是取代object转换而存在的。实则是对泛型的认知误解。泛型只能在部分条件合适的情况下取代OBJECT转换,提高效率。而OBJECT仍然是兼容性非常高的,特殊的存在,即使推出了泛型,微软也没有能将数据库的基石DATATABLE改写成泛型版本的。这点你可以反编译DATATABLE源码看看。内部不论存什么元素,都是转OBJECT存的,也就是说你这个问题微软也遇到了(一行记录为一个集合,集合内包含多种后期使用时才定义的数据类型),微软都做不到,你用微软的产品哪里能做到?楼主要谦虚地感谢楼上回答问题的人,并认识到自己提了个可笑的问题,因为自己不知道这有多么可笑。
楼上的定义IColumn或定义ObjectColumn的方法都是合适的方法。2、在很多时候,直接用一个类(如ObjectColumn)就够了,没有必要定义Column<int>、Column<bool>和Column<string>三个类。然后在ObjectColumn的object Value中保存int、bool或string数据。如果楼主真的不想用Object类型来保存Column中的Value,也可以考虑为IColumn或ObjectColumn定义一个string value来保存数据,再定义一个你自定义枚举类型(0-int, 1-bool, 2-string)的dataType属性来保存数据的类型。在输出栏目的时候利用dataType来格式化value。