我有一个带有字典的类,它将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#中实现这一目标?如果没有,为什么不,你会建议什么替代方案?
答案 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];
}
}
如果字典需要包含每种类型的多个对象,则字典值可以是对象列表。