挣扎着静态类型

时间:2014-12-08 14:11:56

标签: c# static

我有这个方法返回一个列表:

public List<int> GetCapabilitiesInfo()
{
    List<int> sizeList = new List<int>();
    int cellSize = m_tree.db.getCellSize();
    int mapSize = m_tree.db.m_mapInfo.mapsize;

    sizeList.Add(cellSize);
    sizeList.Add(mapSize);

    return sizeList;
}

上面返回的列表是我希望在另一个类中使用此方法的列表: 但它失败了,因为它无法访问statix上下文中的非静态字段。

public static void TileMapCapabilities(string title)
{
    // This method call from another class fails because it can't access a non-static field in a static context
    TilePicker.GetCapabilitiesInfo();
    TileMapObject tmo = new TileMapObject()
    {
        Title = title,
        Abstract = "Some clever text about this.",
        SRS = "OSGEO:41001",
        Profile = "local",
        BoundingBox = new BoundingBox() { maxX = 10000000, maxY = 10000000, minX = -10000000, minY = -10000000 },
        Origin = new Origin() { maxX = 123, maxY = 456, minX = -123, minY = -456 },
        EBoundingBox = new EBoundingBox(),
        MapSize = 256,
        CellSize = 3
    };            
}

我尝试做的是将两个整数cellSizemapSize添加到我想要返回的列表中,这样我就可以在其中选出两个值并将其插入到我的TileMapObject。如果我将GetCapabilitiesInfo()设为静态,那么我只会遇到与m_tree相同的问题,依此类推。我确定我忽略了一些基本的东西吗?

3 个答案:

答案 0 :(得分:2)

您的列表是非静态类的一部分,因此,您需要它声明的对象的实例。 你可以这样做:

public static void TileMapCapabilities(string title, TilePicker picker)
{
    var list = picker.GetCapabilitiesInfo();
    //do whatever you want to do with the list;            
}

您也可以传递列表:

public static void TileMapCapabilities(string title, List<int> list)
{
    //do whatever you want to do with the list;            
}

请记住,您要调用的例程所在的类不是静态的,因此,您必须将其实例化以使用该例程。

答案 1 :(得分:0)

我假设您无法使GetCapabilitiesInfo静态,因为它似乎使用m_tree等实例成员。如果是这种情况,那么您需要拥有TilePicker的实例才能调用GetCapabilitiesInfo。因此,您需要在TileMapCapabilities中创建一个:

public static void TileMapCapabilities(string title)
{
    // This method call from another class fails because it can't access a non-static field in a static context
    TilePicker tp = new TilePicker();
    // initialize tp?
    tp.GetCapabilitiesInfo();

或添加一个参数,以便传入一个参数:

public static void TileMapCapabilities(string title, TilePicker tp)
{
    // This method call from another class fails because it can't access a non-static field in a static context
    tp.GetCapabilitiesInfo();

如果这些都不是选项,那么你必须查看设计才能连接这两个类。由于您当前的代码对返回的列表没有任何作用,因此不清楚它们应该如何连接。

答案 2 :(得分:0)

您需要创建类TilePicker的实例,因为您的方法GetCapabilitiesInfo未标记为静态。

TilePicker t = new TilePicker();
t.GetCapabilitiesInfo();

但是,您也可以将方法标记为静态,从而不需要实例:

static void GetCapabilitiesInfo() {...}