基于C#中Type参数的泛型返回类型

时间:2013-04-25 14:36:29

标签: c# generics

我有一个带有字典的类,它将Type个键映射到实现某个接口IWhatever的对象。

我希望创建一个泛型函数,它将Type作为输入并返回映射到字典中该类型的对象。

类似的东西:

public T get<T>(Type type) 

其中T是类型实例,类型实现IWhatever

我不想返回Object甚至Iwhatever,而是返回给定类型的对象。返回对象的类型可以在编译时明显地进行。所以我认为它应该是可能的。

我已经设法在java中执行此操作:

public T get<T>(Class<T extends IWhatever> type) { // implementation }

有没有办法在C#中实现这一目标?如果没有,为什么不,你会建议什么替代方案?

3 个答案:

答案 0 :(得分:7)

我想你想要:

public T Get<T>() where T : IWhatever { ... } 

有关详细信息,请参阅Constraints on Type Parameters (C# Programming Guide)

当客户端可以在编译时轻松提供类型参数时,这当然有用。在内部,你的方法可能需要很多肮脏,例如:

return (T) myDict[typeof(T)];

答案 1 :(得分:0)

我认为你被Java的擦除误导了。请考虑您帖子中的以下Java代码(编辑以使其成为有效代码):

public <T extends IWhatever> T get(Class<T> type) { // implementation }

在这种情况下,只需要type参数,因为泛型类型信息仅在编译时可用。在C#中不是这样,您可以在其中编写以下内容:

public T Get<T>()
    where T : IWhatever
{
    Type type = typeof(T);
    // rest of implementation
}

答案 2 :(得分:0)

从你的前两句,我想你想要的是以下几点。您必须决定您的类型的某些属性将是唯一的。您可以确保您拥有的所有类型都包含GUID属性。

public class MyClass
{
  private Dictionary<GUID, object> _myDictionary;
  public AddObject(object objectToAdd)
  {
      _myDictionary.Add(objectToAdd.GUID, objectToAdd);
  }
  public object GetObject(Type typeToGet)
  {
    return _myDictionary[typeToGet.GUID];
  }
}

如果字典需要包含每种类型的多个对象,则字典值可以是对象列表。