首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -将参数约束为

问C# -将参数约束为
EN

Stack Overflow用户
提问于 2012-06-29 03:43:48
回答 4查看 133关注 0票数 1

我想创建一个将Type映射到Action的Dictionary,但我希望键是来自特定父类的类型。所以我想做一些类似的事情:

代码语言:javascript
复制
class Container
{
    private Dictionary<Type, Action> dict;

    public void AddAction(Type t, Action a) where t : typeof(SomeParentClass)
    {
        dict[t] = a;
    }
}

其中,AddAction方法只接受作为某个特定类的子类的类类型的t的值。我在java语言中见过用extends关键字做这样的事情,但我不知道如何在C#中做到这一点,如果这是可能的话。

Edit:为了澄清,我不希望AddAction方法获取SomeParentClass的实例,而是SomeParentClass的子类的类的类型。有没有比使用类型更好的方法呢?

编辑:我主要想做的是创建一个调度服务,其中应用程序的不同部分可以注册对事件类型的兴趣,并提供当该类型的事件被激发时调用的Action。所以想象一下这样的事情

代码语言:javascript
复制
service.RegisterInterest(typeof(MyEvent), myAction)

其中myAction的类型是Action<MyEvent> (这是我没有放在原始帖子中的东西,但应该有,而不是一个普通的Action)。

然后,应用程序的其他部分可以执行以下操作

代码语言:javascript
复制
service.TriggerEvent(typeof(MyEvent))

这使得所有如上所述注册的Action<MyEvent>实例都是called...So,事实上Dictionary将Type映射到List<Action<Event>>,而不是单个Action。

EN

回答 4

Stack Overflow用户

发布于 2012-06-29 03:52:13

如果需要编译时检查,可以使用泛型:

代码语言:javascript
复制
public void AddAction<T>(Action a) where T : SomeParentClass
{
    dict[typeof(T)] = a;
}

您可能还希望保留非通用版本

代码语言:javascript
复制
public void AddAction(Type t, Action a)
{
    if(! typeof(SomeClass).IsAssignableFrom(t)) throw new ArgumentException();
    dict[t] = a;
}
票数 6
EN

Stack Overflow用户

发布于 2012-06-29 03:53:03

我会用这样的东西:

代码语言:javascript
复制
class Container
{
    private Dictionary<Type, Action> dict;

    public bool AddAction(Type t, Action a) 
    {
        if (typeof(SomeParentClass).IsAssignableFrom(t))
        { 
            dict[t] = a;
            return true;
        }
        return false;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-06-29 03:46:15

使用SomeParentClass t作为参数,而不是Type t

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11251778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档