gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:11:03 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com