C#反射和实例化 – 有没有办法做Activator.CreateInstance(myType){X = x}?

C#反射和实例化 – 有没有办法做Activator.CreateInstance(myType){X = x}?,第1张

概述我不确定这种代码的术语,但我想知道是否可以在括号后实例化变量,但是在使用反射时. 我有一个从XML文件加载的地图.这是(int X,int Y,string S)的集合,其中X,Y是某个地形的位置,S是表示地形类型的字符串.我有一个字典在字符串和相关类型之间传递;例如,一个键值对可能是“Tree”,typeof(Tree). 当使用反射时,虽然我知道可以用参数进行实例化,但我唯一的方法就是使用Ac 我不确定这种代码的术语,但我想知道是否可以在括号后实例化变量,但是在使用反射时.

我有一个从XML文件加载的地图.这是(int X,int Y,string S)的集合,其中X,Y是某个地形的位置,S是表示地形类型的字符串.我有一个字典在字符串和相关类型之间传递;例如,一个键值对可能是“Tree”,typeof(Tree).

当使用反射时,虽然我知道可以用参数进行实例化,但我唯一的方法就是使用Activator.CreateInstance(Type t),即使用空构造函数.

当我对地图进行硬编码时,我最初会像这样实例化(在某些i,j for循环中):

case: "Tree" world.Add( new Tree(i,j) );

在开始考虑反射和我的保存文件的同时,我将其更改为:

world.Add( new Tree() { X = i,Y = j }

但是,我意识到这不适用于反射,所以我必须执行以下 *** 作(Tree继承自Terrain,而字典只是将XML保存数据字符串转换为类型):

Type type = dictionary[dataItem.typeAsstring];Terrain t = (Terrain)Activator.CreateInstance(type);t.X = i;t.Y = j;world.Add(t);

我更喜欢用类似的东西来做这件事

Type type = dictionary[dataItem.typeAsstring];world.Add((Terrain)Activator.CreateInstance(type) { X = i,Y = j }

有这样的捷径吗?我想如果不是我可以编辑world.Add采取X和Y并转发到Terrain来访问那些变量,但我仍然很好奇a)这个{var1 = X,var2 = Y}编程被调用,和b)使用反射时是否存在类似的东西.

解决方法 这种语法称为Object Initializer语法,只是用于设置属性的语法糖.

代码var result = new MyType {X = x}将被编译为:

MyType __tmp = new MyType();__tmp.X = x;MyType result = __tmp;

如果只在运行时知道实例化类型,则必须自己使用PropertyInfo.SetValue,或者如果在编译时已知类型,则使用普通属性setter.

总结

以上是内存溢出为你收集整理的C#反射和实例化 – 有没有办法做Activator.CreateInstance(myType){X = x}?全部内容,希望文章能够帮你解决C#反射和实例化 – 有没有办法做Activator.CreateInstance(myType){X = x}?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存