约束System.Type作为类型安全的通用参数

时间:2016-12-28 23:31:41

标签: c# types

我有一本字典 - 其中的关键字是System.Type。我没有进一步约束字典条目;但是,字典只能通过公共类接口公开。我正在模仿一个事件系统。

System.Collections.Generic Dictionary看起来像:

private Dictionary<Type, HashSet<Func<T>>> _eventResponseMap;

公开字典的方法之一具有以下签名:

public bool RegisterEventResponse<T>(Type eventType, Func<T> function)

但是,我不希望类用户能够通过此签名将任何System.Type添加到字典中。有没有办法可以进一步约束Type参数?

我真正想要的是类似于(伪代码)的东西:

public bool RegisterEventResponse<T>(Type eventType, Func<T> function) where Type : ICustomEventType

2 个答案:

答案 0 :(得分:3)

不,您不会在Type上获得编译时安全性。

您可以将T(或添加参数)约束到ICustomEventType,然后使用typeof中的RegisterEventResponse来获取您要查找的Type对象。

或者只是抛出异常:

if (!typeof(ICustomEventType).IsAssignableFrom(typeof(T))
{
    throw new ArgumentException("Type is not supported");
}

答案 1 :(得分:2)

为什么不更改方法的签名?

public bool RegisterEventResponse<TEvent, TReturn>(Func<TReturn> function)
    where TEvent: ICustomEventType
{
    _eventResponseMap[typeof(TEvent)] = function;  
}

是的,您丢失了类型推断,但您获得了类型安全性。而不是撰写RegisterEventResponse(typeof(CustomEvent), () => 1),您需要撰写RegisterEventResponse<CustomEvent, int>(() => 1)