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

标签 c# .net extension-methods generic-programming generics

我正在寻找提高我正在开发的应用程序中某些代码的一致性、简洁性和可读性的方法。起始代码看起来像这样:

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/

相关文章:

c# - 如何在排序字典中找到两个键之间的点

c# - 自动隐藏菜单条

c# - 找不到 HttpRequestMessage,但引用了 System.Net.Http

c# - 有没有办法概括 Action 和 Action<T>?

c# - 十进制舍入扩展错误 - 无法使用实例引用访问;用类型名称限定它

c# - 按日期范围分组,在每个组内计数和排序 LINQ

c# - 将 Office 2010 Web 应用程序与 ASP.NET 结合使用

c# - 正则表达式:表现懒惰的贪婪量词

c# - 使用互斥锁确保异步应用程序的单一实例

c# - 依赖注入(inject)和第三方 API - 带 PI 的扩展方法或带 CI 的包装器