具有泛型类型参数的类型的C#扩展方法

我正在研究如何提高我正在处理的应用程序中某些代码的一致性,简洁性和可读性.起始代码看起来像这样:
context.GetGraphType<Bar>().Subscribe<Fizz>(
     (instance,evt) => e.Execute((Bar)instance.Instance)
);

如上所述,有许多几乎相同的代码行.我想重写它看起来像这样:

typeof(Bar).Subscribeto<Fizz>(context);

首先,这将使我能够利用已经成为非正式会议的形式化.此外,我希望它现在会读取类似“bar在订阅上下文中订阅fizz事件”,而不是“上下文获取条形码并订阅fizz然后做一些事情.”我认为流程是更好,我询问同事的同事.

我开始将其作为扩展方法实现.为了实现上述目的,我想为事件类型使用抽象通用基类,因此Fizz将是Event< T>.这意味着扩展方法的泛型类型参数必须被约束为调用扩展方法的类型.因此,对于上面的示例,Fizz必须是Event< Bar>类型.

这可能吗?我在同一时间采用了替代解决方案,但我仍然很好奇是否可以实现.其他建议也是受欢迎的.

谢谢!

编辑#1:为了清楚,我意识到我可以使用一个额外的类型参数,但我正在寻找避免这种情况的方法.

编辑#2:
我想我会接受一个接受的答案的微小变化,因为它与我的情景不匹配100%.底线是可以使用通用静态类而不是Type的扩展方法来实现我的目标.谢谢dss539!

更新代码(因为我在飞行中这样做可能会出现错别字):

public class Bar { }

public class Event<TSubscriber>
{
    public abstract void Execute(TSubscriber source);
}

public class Fizz : Event<Bar>
{
    public override void Execute(Bar bar)
    {
        // respond to event
    }
}

public class Context { }

public static class ForType<TSubscriber>
{
    public static void Subscribeto<TEvent>(Context context)
        where TEvent : Event<TSubscriber>
    {
        context.GetType<TSubscriber>().Subscribe<TEvent>(
            (evt,args) => evt.Execute((TSubscriber)args.source));
    }
}

public static void Run()
{
    ForType<Bar>.Subscribeto<Fizz>(context);
}

解决方法

这不完全像你问的那样,但也许就足够了.
internal class Program
{
    static void Main(string[] args)
    {
        var fizzHandler = new Fizz();
        var context = new Context();
        Handle<Bar>.With(fizzHandler,context);
    }
}
public class Bar { }
public class Event<T> { }
public class Fizz : Event<Bar> { }
public class Context { };
public static class Handle<T>
{
    public static void With(Event<T> e,Context c)
    {
        //do your stuff
    }
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...