gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:07:59 25 4
gpt4 key购买 nike

我不确定这种代码的术语,但我想知道是否可以在括号后实例化变量,但同时使用反射。

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

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

当我对 map 进行硬编码时,我最初会像这样实例化(在一些 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) 使用反射时是否存在类似的东西。

最佳答案

这种语法称为对象初始化语法,只是用于设置属性的语法糖。

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

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

如果您仅在运行时知道实例化的类型,或者如果类型在编译时已知,则您必须使用 PropertyInfo.SetValue 自己完成此操作。

关于C# 反射和实例化 - 有没有办法做 Activator.CreateInstance(myType){ X = x }?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362674/

25 4 0