1

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

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

就像是 :

public T get<T>(Type type) 

其中 T 是 type 和 type implements 的实例IWhatever

我不想返回Object,甚至不想返回Iwhatever给定类型的对象。返回对象的类型可以在编译时清楚地推断出来。所以我认为这应该是可能的。

我已经设法在java中做到这一点:

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

有没有办法在 C# 中实现这一点?如果不是,为什么不呢?您会建议什么替代方案?

4

3 回答 3

7

I think you want:

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

For more information, see Constraints on Type Parameters (C# Programming Guide).

This is of course only useful when the client can provide the type argument easily at compile-time. Internally, your method may need a lot of nastiness, e.g.:

return (T) myDict[typeof(T)];
于 2013-04-25T14:39:02.523 回答
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];
  }
}

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

于 2013-04-25T15:07:33.870 回答
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
}
于 2013-04-25T14:42:24.530 回答