如何将一个变量转换为另一个变量的获得类型?

时间:2018-09-22 02:09:58

标签: c#

编辑:好的,这是我正在做的事情的更长的解释:

这是一个有序词典,标有“存储” ...

@objc func handleZoom(recognizer: UIPinchGestureRecognizer) {
  switch recognizer.state {
    case .began:
      break
    case .changed:
      let scaleRange: ClosedRange = Double(2)...Double(14)
      let currentScale = cameraNode.camera?.orthographicScale
      let scale = recognizer.velocity
      let newScale = currentScale! - Double(scale)
      let clampedScale = scaleRange.clamp(newScale)
      cameraNode.camera?.orthographicScale = clampedScale
      break
    default: break
  }
}

其中的“ AddToStorage()”用于获取存储中具有的任何列表值类型的参数(项目),而无需测试带有多个“否则”的每种潜在类型。

这就是我要尝试执行的操作,但是我收到“'ItemType'是变量,但像类型一样使用”的错误:

public OrderedDictionary Storage = new OrderedDictionary()
    {
                { "Trinkets", new List<Trinket>{} },
                { "Misc Equipment", new List<MiscEquipment>{} },
                { "Headdresses", new List<Headdress>{} },
                { "Weapons", new List<Weapon>{} },
                //and so on...
    };

所以我显然不能使用“类型”类型的变量“像类型”,因为类型“类型”的变量是变量而不是类型。撕。

1 个答案:

答案 0 :(得分:2)

TrinketMiscEquipmentHeaddressWeapon听起来好像它们都应该源自共同的Item类型(或实现共同的{{1 }}界面。

为论证起见,假设它们都源自IItem。您可以修改方法以接受受约束的泛型:

Item

使用受约束的泛型(受public void AddToStorage<TItem>(TItem item) where TItem: Item, new() { var storageList = Storage.Values.OfType<List<TItem>>().Single(); storageList.Add(item); } 约束),您可以找到类型为where TItem: Item的列表,并向其中添加项目。 List<TITem>部分将确保类型作为公共的无参数构造函数(因此不是抽象或接口)。

请注意,new()期望只找到一个类型为.Single()的列表,否则将抛出异常。如果列表可能不存在,则可以将其更改为List<TItem>,并添加空检查。据我对您的情况的了解,情况并非如此,因此SingleOrDefault()应该没问题。