C#反射和实例化-是否可以执行Activator.CreateInstance(myType){X = x}?

Hai*_*rom 5 c# reflection instantiation

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

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

当使用反射时,尽管我知道可以用参数实例化,但我唯一的舒适方法是使用Activator.CreateInstance(Type t),即使用空构造函数。

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

case: "Tree"
 world.Add( new Tree(i,j) );
Run Code Online (Sandbox Code Playgroud)

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

world.Add( new Tree() { X = i, Y = j }
Run Code Online (Sandbox Code Playgroud)

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

Type type = dictionary[dataItem.typeAsString];
Terrain t = (Terrain)Activator.CreateInstance(type);
t.X = i;
t.Y = j;
world.Add(t);
Run Code Online (Sandbox Code Playgroud)

我宁愿使用类似

Type type = dictionary[dataItem.typeAsString];
world.Add((Terrain)Activator.CreateInstance(type) { X = i, Y = j }
Run Code Online (Sandbox Code Playgroud)

有没有这样的捷径?我想我是否可以编辑world.Add取一个X和Y并转换为Terrain来访问这些变量,但我仍然对a)这种{var1 = X,var2 = Y}编程的名称感到好奇b)使用反射时是否存在类似的东西。

Dan*_*rth 5

此语法称为对象初始化器语法,仅是用于设置属性的语法糖。

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

MyType __tmp = new MyType();
__tmp.X = x;
MyType result = __tmp;
Run Code Online (Sandbox Code Playgroud)

PropertyInfo.SetValue如果您仅在运行时知道实例化的类型,则必须自己使用;如果在编译时知道该类型,则必须使用常规的属性设置器。