[C#]要如何实例化未知型式的对象?

时间:2022-01-07 05:18:26
大家好~

假设我有个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


引用 1 楼 caozhy 的回复:
(1) 使用泛型,推荐。
(2) 使用 object 类型。


同意

#3


引用 1 楼 caozhy 的回复:
(1) 使用泛型,推荐。
(2) 使用 object 类型。


上面是举例,但实际上会具备更多不同的类型...
(1)使用泛型不可行
(2)使用object 类型?? 又如何存取对象的栏位与属性? 用反射?

(3)若用Activator.CreateInstance 合适么???

#4


使用泛型不可行
我想是你能力问题。

#5


引用 4 楼 caozhy 的回复:
使用泛型不可行
我想是你能力问题。

泛型速度很慢,且需要明确告知类型。

#6


说错了,是
"反射比泛型速度慢,但我要处理的类型非常多"。

难道要一种一种编写?

#7


ArrayList 要装箱拆箱,你觉得它比反射快?

至少那些经常习惯拿性能说事的人会反驳你的。。。

#8


那么,再改成"我要处理的类型非常多"

难道要一种一种编写?

#9


引用 8 楼 qwer20000 的回复:
那么,再改成"我要处理的类型非常多"

难道要一种一种编写?

class ClassName<T>
{
    public T GetElement(int id, List<T> list) { return list[i]; }
}

#10


引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?

你会所得所谓“未知类型对象”,不就是回到了object上来了嘛?!那么你有绕回到ArrayList本身上来了。那么既然ArrayList就是对于object抽象类型、也就是具体对象的类型是可以任意的,你何必要搞个否定ArrayList?

我们不使用ArrayList而使用强类型,是为了增强我们在编码之前就进行清晰的系统分析设计的能力。不是为了搞学术,搞什么“未知类型”。所以“未知类型”这个说法本身就是重复原始的ArrayList,没有实际新意。

#11


引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?……


息怒息怒...我知道我的问题了:
不同类型的对象各自有不同的栏位,当然要各自处理。
想要用一个简单的方法处理所有类型似乎是不可能的。
所以还是用caozhy的,或直接用List<>。

可我看到一博客上说:
~~~~~
object myClass = new object();
myClass = Activator.CreateInstance(myObj.GetType());

这样一来myClass就完全拥有myObj的属性了~~
~~~~~

"这样一来myClass就完全拥有myObj的属性了"???

有那么好的事...??? 我搞乱了???

#12


上面那个变量myClass已经变成了跟myObj一样类型的另一个实例了。

#13


引用 11 楼 qwer20000 的回复:
引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代……


或者,如果你用 C#4 的话,可以尝试使用 dynamic 类型。

#14


引用 13 楼 caozhy 的回复:
引用 11 楼 qwer20000 的回复:
引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对……


虽然我还在用C#2008,但msdn给的 dynamic 的例子看起来很合适, 试试看。
另外,Activator.CreateInstance那个不但速度奇慢无比,且还是要再强制转换类型一次。
谢谢各位啦~晚安

#15


如果你在编程之前不搞清楚自己想要什么类型的对象,那么你说的“里面存放了 float, int, double,... 等多种型式的不同对象”就是这个意思。实际上你耽误了许多人的时间,这是一个语言游戏。

#16


Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。

#17


可以使用面向对象设计中的继承和多态的概念

补充这一句:面向接口来编程的概念。

#18


引用 16 楼 sp1234 的回复:
Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。

是的,dynamic只是简化了反射的调用。但是反射并不是洪水猛兽,不知道为什么反射被妖魔化成性能低下、问题很多的代名词,但是具体情况具体分析的。
另外赞同sp1234的说法,首先考虑的是设计层面的问题,这样的设计本身可以改良。

#19


谢谢二位!

sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)

使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。

非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。

#20


反射还是相当不错的……

#1


(1) 使用泛型,推荐。
(2) 使用 object 类型。

#2


引用 1 楼 caozhy 的回复:
(1) 使用泛型,推荐。
(2) 使用 object 类型。


同意

#3


引用 1 楼 caozhy 的回复:
(1) 使用泛型,推荐。
(2) 使用 object 类型。


上面是举例,但实际上会具备更多不同的类型...
(1)使用泛型不可行
(2)使用object 类型?? 又如何存取对象的栏位与属性? 用反射?

(3)若用Activator.CreateInstance 合适么???

#4


使用泛型不可行
我想是你能力问题。

#5


引用 4 楼 caozhy 的回复:
使用泛型不可行
我想是你能力问题。

泛型速度很慢,且需要明确告知类型。

#6


说错了,是
"反射比泛型速度慢,但我要处理的类型非常多"。

难道要一种一种编写?

#7


ArrayList 要装箱拆箱,你觉得它比反射快?

至少那些经常习惯拿性能说事的人会反驳你的。。。

#8


那么,再改成"我要处理的类型非常多"

难道要一种一种编写?

#9


引用 8 楼 qwer20000 的回复:
那么,再改成"我要处理的类型非常多"

难道要一种一种编写?

class ClassName<T>
{
    public T GetElement(int id, List<T> list) { return list[i]; }
}

#10


引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?

你会所得所谓“未知类型对象”,不就是回到了object上来了嘛?!那么你有绕回到ArrayList本身上来了。那么既然ArrayList就是对于object抽象类型、也就是具体对象的类型是可以任意的,你何必要搞个否定ArrayList?

我们不使用ArrayList而使用强类型,是为了增强我们在编码之前就进行清晰的系统分析设计的能力。不是为了搞学术,搞什么“未知类型”。所以“未知类型”这个说法本身就是重复原始的ArrayList,没有实际新意。

#11


引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代码)给我说明什么叫做“未知类型”这个概念?……


息怒息怒...我知道我的问题了:
不同类型的对象各自有不同的栏位,当然要各自处理。
想要用一个简单的方法处理所有类型似乎是不可能的。
所以还是用caozhy的,或直接用List<>。

可我看到一博客上说:
~~~~~
object myClass = new object();
myClass = Activator.CreateInstance(myObj.GetType());

这样一来myClass就完全拥有myObj的属性了~~
~~~~~

"这样一来myClass就完全拥有myObj的属性了"???

有那么好的事...??? 我搞乱了???

#12


上面那个变量myClass已经变成了跟myObj一样类型的另一个实例了。

#13


引用 11 楼 qwer20000 的回复:
引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对象”,你能够用个最简单的一行代码(最基本的c#代……


或者,如果你用 C#4 的话,可以尝试使用 dynamic 类型。

#14


引用 13 楼 caozhy 的回复:
引用 11 楼 qwer20000 的回复:
引用 10 楼 sp1234 的回复:
引用楼主 qwer20000 的回复:
但是,若我想要在运行状态下自动声明不同型态的对象,要怎么办呢?

有类似这样的(错误)办法吗:  
ArrayList[i].GetType() ABC = (ArrayList[i].GetType()) ArrayList[i];

什么叫做“不同类型对……


虽然我还在用C#2008,但msdn给的 dynamic 的例子看起来很合适, 试试看。
另外,Activator.CreateInstance那个不但速度奇慢无比,且还是要再强制转换类型一次。
谢谢各位啦~晚安

#15


如果你在编程之前不搞清楚自己想要什么类型的对象,那么你说的“里面存放了 float, int, double,... 等多种型式的不同对象”就是这个意思。实际上你耽误了许多人的时间,这是一个语言游戏。

#16


Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。

#17


可以使用面向对象设计中的继承和多态的概念

补充这一句:面向接口来编程的概念。

#18


引用 16 楼 sp1234 的回复:
Dynamic类型涉及到的是反射方式来调用对象的属性和方法。而反射调用对象的属性和方法(也包括事件)这个是万不得已的,一般来说不要随便使用。还是从设计的时候,而不是编码的时候,就搞清楚你的类型,这比较好。要想让类型可变,可以使用面向对象设计中的继承和多态的概念,而不是编程中的反射。

是的,dynamic只是简化了反射的调用。但是反射并不是洪水猛兽,不知道为什么反射被妖魔化成性能低下、问题很多的代名词,但是具体情况具体分析的。
另外赞同sp1234的说法,首先考虑的是设计层面的问题,这样的设计本身可以改良。

#19


谢谢二位!

sp1234的意思是先定义好接口,
到时自然所有继承了该接口的对象就能被使用那些属性和方法。(应该是这样吧)

使用反射时需要在众多的栏位、属性或方法中寻找,不知dynamic是怎么运作的。

非有意玩弄文字,而是观念很不清楚(面相对象),没先搞清楚自己要做什么事情。
基础不好,没上过正式的编程课且书也翻得太少了,总还是谢谢二位了。

#20


反射还是相当不错的……

#21