我正在寻找方法来改进我正在处理的应用程序中的一些代码的一致性,简洁性和可读性。起始代码看起来像这样:带有泛型类型参数的C#扩展方法
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => e.Execute((Bar)instance.Instance)
);
有许多几乎与上面相同的代码行。我想改写它看起来是这样的:
typeof(Bar).SubscribeTo<Fizz>(context);
一方面,这将使我采取什么正规化已经成为一种非正式会议的优势。另外,我希望它现在可以阅读“bar在特定上下文中订阅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);
}
我不太明白你的问题。你现有的方法签名是什么样的? '订阅(这种类型,动作)'?如果你显示你有什么(或相当的),这可能有助于解释。 –
dss539
2010-06-25 14:48:08
我想我有一个类似的设计问题。祝你好运:) – leppie 2010-06-25 14:48:30
@ dss539 它会更像订阅(这种类型,上下文ctx)。问题是,我没有办法(我知道)将T约束为Event 类型。 –
2010-06-25 15:07:11