编辑:好的,这是我正在做的事情的更长的解释:
这是一个有序词典,标有“存储” ...
@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...
};
答案 0 :(得分:2)
Trinket
,MiscEquipment
,Headdress
和Weapon
听起来好像它们都应该源自共同的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()
应该没问题。