- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不确定这种代码的术语,但我想知道是否可以在括号后实例化变量,但同时使用反射。
我有一个从 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/
我在为自定义类型的 ObservableCollection 创建扩展方法时遇到问题。我需要创建的扩展方法是“ToAnotherType”类型(如 ToList、ToArray)。 MyPoint 示
所以基本上我有这个方法。 public List FilterCustomersByStatus(List source, string status) { return (List)sour
我在 Clojure 中使用 deftype 时遇到了问题。如果我运行以下代码: (defprotocol TestProt (geta [this]) (getb [this])) (def
给定以下类: public class MyType { public static implicit operator MyType(Func wrapper) { retu
我定义了一个简单的代数(具体)数据类型,MyType: data MyTpe = MyBool Bool | MyInt Int ...我正在尝试找到一种方法将任意函数(a->b)“转换”为关联的(M
我有一个在运行时动态创建新类型的应用程序,创建该类型的对象并将它们插入 object 类型的 MongoDB 数据库集合中。使用 shell 我可以看到对象被正确插入并且 _t 值是动态创建的类的正确
与仅使用 List(Of MyType) 相比,使用 ConcurrentBag(Of MyType) 有什么优势? The MSDN page on the CB指出 ConcurrentBag(O
我想通过使用map一对一地从异步函数中加载多个描述: Future> loadDescriptions(List questions) async { Iterable> iterable
我想在线程之间传递一些信息。原子听起来像是要使用的东西。我看了一下this 。并发现一个简单的结构,例如 struct MyType{ int val_a,val_b; float vals_
我得到的具体异常是: Unable to cast object of type NbtByte to type INbtTag 在这一行: tag = (INbtTag)new NbtByte(st
是的,我已经完成了标题相似的问题。它们似乎都不符合我所处的情况。这只是程序员向 View 发送了错误的对象类型。 这是我收到的确切错误消息: The model item passed into th
这是一个玩具示例: #[derive(Debug)] struct Int { v: i32, } #[derive(Debug)] struct Double { v: f64, }
在我没有编写但必须使用的代码中,使用 OpenCV(但它可以是任何东西)我遇到了类似的东西: void foo (long addrImage){ [...] Mat& image = *(M
我有一个自定义列表 MyList,它是 List 的扩展,并且我有一个我想执行的 IEnumerable(或 IQueryable).ToList( ) 上,但我猜,.ToMyList()。 如何实现
[Test] public void testMultiplication() { var five=new Dollar(5); Assert.AreEqual(new Dollar
假设我有一个类 MyType: sealed class MyType { static Type typeReference = typeof(MyType); //... } 给定
我有一个如下所示的 ArrayList: final List myList = new ArrayList<>(); MyType 看起来像这样: public class MyType {
我正在使用来自不同模块的类型,我们将其称为 OtherModule.MyType, 这段代码: var a = [OtherModule.MyType]() 将产生错误无效使用“()”来调用非函数类型
我在下面列出了一个相当人为的例子,来 self 正在研究的更大的东西。我遇到了我认为是关于使用 Any 类型的 Swift 编译器错误。 struct Labelable { let t: T
我正在使用 Dictionary在一个类(class)。该类实现了一个需要 IList 的接口(interface)被退回。有没有一种简单的方法可以将一个转换为另一个(无需复制整个内容)? 我目前的解
我是一名优秀的程序员,十分优秀!