基于输入数据的自定义返回类型

时间:2018-03-27 02:11:16

标签: c# .net generics

我有一个方法,它接受一个接口类型并评估类型是什么,从中我需要返回一个与之相关的类型。但我不确定如何使类型返回灵活。我试过这样的事情:

public static T GridPosition <T>(IReSizeableGrid gridData) {
  if (gridData is Hex) {
    var hexGrid = (HexGrid) gridData;
    return HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
  }
  if (gridData is QuadGrid) {
    var quadGrid = (QuadGrid) gridData;
    return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
  }
  throw new Exception("Wrong type passed to GridPosition: " + gridData.GetType());
}

但是我收到了这个错误:

  

无法隐式转换类型Hex to T

我是否使用T在右侧?试着了解如何正确使用它。

2 个答案:

答案 0 :(得分:7)

有时候,仿制药并不是正确的答案。如果您想对两个或多个相关类型执行 相同的事情 ,则只能使用泛型。在这种情况下,您正在做完全不同的事情,因此您实际上需要使用method overloading代替。

public static Point GridPosition(HexGrid gridData)
{
    return HexLibrary.WorldToHex( WorldPoint( Input.mousePosition, GroundPlane), gridData);
}

public static Point GridPosition(QuadGrid gridData)
{
    return Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), gridData);
}

您可以使用相同的代码调用其中任何一个:

var result = GridPosition(new HexGrid());
var result = GridPosition(new QuadGrid());

...编译器将为您挑选合适的版本。

答案 1 :(得分:0)

由于HexQuadGrid实施IReSizeableGrid,您可以将gridData参数的类型设为T,然后限制TIReSizeableGrid

public static T GridPosition<T>(T gridData) where T : IReSizeableGrid {
    if (gridData is Hex) {
        var hexGrid = (HexGrid) gridData;
        return (T)HexLibrary.WorldToHex(WorldPoint(Input.mousePosition, GroundPlane), hexGrid);
    }
    if (gridData is QuadGrid) {
        var quadGrid = (QuadGrid)gridData;
        return (T)Grid.Get(WorldPoint(Input.mousePosition, GroundPlane), quadGrid);
    }
    throw new Exception("Wrong type passed to GridPosition: "+gridData.GetType());
}

调用函数时,不需要指定类型<T>。它将取自gridData参数的类型。