代码之家  ›  专栏  ›  技术社区  ›  MartyIX

这是一个错误使用泛型的例子吗?

  •  2
  • MartyIX  · 技术社区  · 14 年前

        public IGamePlugin[,] GetTable<T>()
        {
            Type t = typeof(T);
    
            if (t is IFixedElement)
            {
                return fixedElements;
            }
            else if (t is IFixedTile)
            {
                return fixedTiles;
            }
            else
            {
                throw new NotSupportedException("Type:" + t.ToString() + " is not supported");
            }
        }
    

    我很不确定泛型的用法是否正确。我喜欢它胜过使用简单的参数(字符串或者类型),因为调用端的语法很清楚。

    你怎么认为?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Ben Voigt    14 年前

    这应该是两个独立的函数, GetElementsTable GetTilesTable

    回答你的问题,你这样做肯定是滥用泛型。但你说得对,使用参数也是不好的。

        2
  •  2
  •   Marc Gravell    14 年前

    它是一个 这个 T ,除了 typeof(T) Type 实例作为参数。

    is 此处不正确;您正在测试 类型 类型机具 IFixedTile 等等,这会 从未 是真的(除非你正在做一些非常不寻常的事情);你可能想测试 实现接口。也许 IsAssignableFrom

        3
  •  1
  •   Andrew Bezzub    14 年前

    我同意本·沃伊特的观点——这应该是两种不同的方法。

    Type 对象ant它没有实现任何接口。相反,你应该使用 t.GetInterface("IFixedElement") != null

        4
  •  0
  •   MrFox    14 年前

    public enum ElementType
    {
        FixedElements, FixedTiles
    }
    

    然后可以请求一个ElementType参数。

        5
  •  0
  •   code4life    14 年前

    看起来您正在返回一个特定的2D数组,具体取决于所提供的类型。所以你要找的基本参数不是实际值 对象 被通过了,但是 类型 Dictionary<Type, IGamePlugin[,]> 从字典里得到你需要的值?

    // declare this somewhere earlier in the code...
    var plugInDictionary = new Dictionary<Type, IGamePlugin[,]>()
    {
      {typeof(IFixedElement), fixedElements},
      {typeof(IFixedTile), fixedTiles} 
    }
    ...
    
    // where you would normally call the method GetTable call this instead...
    var myGamePlugIn = plugInDictionary[typeof(myObject)];
    

    使用字典的优点是它比使用if块更具动态性,特别是因为它比if块更容易容纳DI。这意味着,例如,您可以将上面的设置注册到一个配置文件,实际上只需编写几行代码,其余的由DI框架处理。我并不是在为您的项目提倡DI,但这是我想到的一个示例,用于说明代码的灵活性。