假设我有个ArrayList,里面存放了 float, int, double,... 等多种型式的不同对象。
若此时从ArrayList里拿出float型式对象,我这样声明:
float ABC = (float)ArrayList[i];
====
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?
有类似这样的(错误)办法吗:
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];
谢谢大家。
20 个解决方案
#1
(1) 使用泛型,推荐。
(2) 使用 object 类型。
(2) 使用 object 类型。
#2
同意
#3
上面是举例,但实际上会具备更多不同的类型...
(1)使用泛型不可行
(2)使用object 类型?? 又如何存取对象的栏位与属性? 用反射?
(3)若用Activator.CreateInstance 合适么???
#4
使用泛型不可行
我想是你能力问题。
我想是你能力问题。
#5
泛型速度很慢,且需要明确告知类型。
#6
说错了,是
"反射比泛型速度慢,但我要处理的类型非常多"。
难道要一种一种编写?
"反射比泛型速度慢,但我要处理的类型非常多"。
难道要一种一种编写?
#7
ArrayList 要装箱拆箱,你觉得它比反射快?
至少那些经常习惯拿性能说事的人会反驳你的。。。
至少那些经常习惯拿性能说事的人会反驳你的。。。
#8
那么,再改成"我要处理的类型非常多"
难道要一种一种编写?
难道要一种一种编写?
#9
class ClassName<T>
{
public T GetElement(int id, List<T> list) { return list[i]; }
}
#10
什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?
你会所得所谓“未知类型对象”,不就是回到了object上来了嘛?!那么你有绕回到ArrayList本身上来了。那么既然ArrayList就是对于object抽象类型、也就是具体对象的类型是可以任意的,你何必要搞个否定ArrayList?
我们不使用ArrayList而使用强类型,是为了增强我们在编码之前就进行清晰的系统分析设计的能力。不是为了搞学术,搞什么“未知类型”。所以“未知类型”这个说法本身就是重复原始的ArrayList,没有实际新意。
#11
息怒息怒...我知道我的问题了:
不同类型的对象各自有不同的栏位,当然要各自处理。
想要用一个简单的方法处理所有类型似乎是不可能的。
所以还是用caozhy的,或直接用List<>。
可我看到一博客上说:
~~~~~
object myClass = new object();
myClass = Activator.CreateInstance(myObj.GetType());
这样一来myClass就完全拥有myObj的属性了~~
~~~~~
"这样一来myClass就完全拥有myObj的属性了"???
有那么好的事...??? 我搞乱了???
#12
上面那个变量myClass已经变成了跟myObj一样类型的另一个实例了。
#13
或者,如果你用 C#4 的话,可以尝试使用 dynamic 类型。
#14
虽然我还在用C#2008,但msdn给的 dynamic 的例子看起来很合适, 试试看。
另外,Activator.CreateInstance那个不但速度奇慢无比,且还是要再强制转换类型一次。
谢谢各位啦~晚安
#15
如果你在编程之前不搞清楚自己想要什么类型的对象,那么你说的“里面存放了 float, int, double,... 等多种型式的不同对象”就是这个意思。实际上你耽误了许多人的时间,这是一个语言游戏。
#16
Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。
#17
可以使用面向对象设计中的继承和多态的概念
补充这一句:面向接口来编程的概念。
补充这一句:面向接口来编程的概念。
#18
是的,dynamic只是简化了反射的调用。但是反射并不是洪水猛兽,不知道为什么反射被妖魔化成性能低下、问题很多的代名词,但是具体情况具体分析的。
另外赞同sp1234的说法,首先考虑的是设计层面的问题,这样的设计本身可以改良。
#19
谢谢二位!
sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)
使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。
非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。
sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)
使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。
非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。
#20
反射还是相当不错的……
#21
#1
(1) 使用泛型,推荐。
(2) 使用 object 类型。
(2) 使用 object 类型。
#2
同意
#3
上面是举例,但实际上会具备更多不同的类型...
(1)使用泛型不可行
(2)使用object 类型?? 又如何存取对象的栏位与属性? 用反射?
(3)若用Activator.CreateInstance 合适么???
#4
使用泛型不可行
我想是你能力问题。
我想是你能力问题。
#5
泛型速度很慢,且需要明确告知类型。
#6
说错了,是
"反射比泛型速度慢,但我要处理的类型非常多"。
难道要一种一种编写?
"反射比泛型速度慢,但我要处理的类型非常多"。
难道要一种一种编写?
#7
ArrayList 要装箱拆箱,你觉得它比反射快?
至少那些经常习惯拿性能说事的人会反驳你的。。。
至少那些经常习惯拿性能说事的人会反驳你的。。。
#8
那么,再改成"我要处理的类型非常多"
难道要一种一种编写?
难道要一种一种编写?
#9
class ClassName<T>
{
public T GetElement(int id, List<T> list) { return list[i]; }
}
#10
什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?
你会所得所谓“未知类型对象”,不就是回到了object上来了嘛?!那么你有绕回到ArrayList本身上来了。那么既然ArrayList就是对于object抽象类型、也就是具体对象的类型是可以任意的,你何必要搞个否定ArrayList?
我们不使用ArrayList而使用强类型,是为了增强我们在编码之前就进行清晰的系统分析设计的能力。不是为了搞学术,搞什么“未知类型”。所以“未知类型”这个说法本身就是重复原始的ArrayList,没有实际新意。
#11
息怒息怒...我知道我的问题了:
不同类型的对象各自有不同的栏位,当然要各自处理。
想要用一个简单的方法处理所有类型似乎是不可能的。
所以还是用caozhy的,或直接用List<>。
可我看到一博客上说:
~~~~~
object myClass = new object();
myClass = Activator.CreateInstance(myObj.GetType());
这样一来myClass就完全拥有myObj的属性了~~
~~~~~
"这样一来myClass就完全拥有myObj的属性了"???
有那么好的事...??? 我搞乱了???
#12
上面那个变量myClass已经变成了跟myObj一样类型的另一个实例了。
#13
或者,如果你用 C#4 的话,可以尝试使用 dynamic 类型。
#14
虽然我还在用C#2008,但msdn给的 dynamic 的例子看起来很合适, 试试看。
另外,Activator.CreateInstance那个不但速度奇慢无比,且还是要再强制转换类型一次。
谢谢各位啦~晚安
#15
如果你在编程之前不搞清楚自己想要什么类型的对象,那么你说的“里面存放了 float, int, double,... 等多种型式的不同对象”就是这个意思。实际上你耽误了许多人的时间,这是一个语言游戏。
#16
Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。
#17
可以使用面向对象设计中的继承和多态的概念
补充这一句:面向接口来编程的概念。
补充这一句:面向接口来编程的概念。
#18
是的,dynamic只是简化了反射的调用。但是反射并不是洪水猛兽,不知道为什么反射被妖魔化成性能低下、问题很多的代名词,但是具体情况具体分析的。
另外赞同sp1234的说法,首先考虑的是设计层面的问题,这样的设计本身可以改良。
#19
谢谢二位!
sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)
使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。
非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。
sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)
使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。
非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。
#20
反射还是相当不错的……