作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在寻找提高我正在开发的应用程序中某些代码的一致性、简洁性和可读性的方法。起始代码看起来像这样:
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => evt.Execute((Bar)instance.Instance)
);
上面有许多几乎相同的代码行。我想重写它看起来像这样:
typeof(Bar).SubscribeTo<Fizz>(context);
一方面,这将使我能够利用正式化已经成为非正式惯例的内容。此外,我希望它现在会读到类似“bar subscribes to the fizz event on the given context”,而不是“context gets the bar type and subscribes to fizz and do some things”。我认为流程更好,我问过的同事也同意。
我开始将其作为扩展方法来实现。为了实现上述目标,我想为事件类型使用抽象通用基类,所以 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
}
}
关于具有泛型类型参数的类型的 C# 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118898/
我是一名优秀的程序员,十分优秀!