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)使用反射时是否存在类似的东西。
此语法称为对象初始化器语法,仅是用于设置属性的语法糖。
该代码var result = new MyType { X = x }将编译为此:
MyType __tmp = new MyType();
__tmp.X = x;
MyType result = __tmp;
Run Code Online (Sandbox Code Playgroud)
PropertyInfo.SetValue如果您仅在运行时知道实例化的类型,则必须自己使用;如果在编译时知道该类型,则必须使用常规的属性设置器。
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |