gpt4 book ai didi

c# - 在方法中推断类型参数

转载 作者:行者123 更新时间:2023-11-30 14:44:53 25 4
gpt4 key购买 nike

我的 C# 库中有一个表示领域实体的类​​层次结构,所有这些最终都来自名为 DomainEntity 的根抽象类。 .一些例子是 PackageCustomer .我雇用 Create()每个类中的工厂方法来创建实例。我还有一个通用处理器类 Processor<T>其中 T: DomainEntity .这个处理器类还使用一个工厂方法来实例化并执行依赖于特定类的业务逻辑,因此它的类型参数。使用这个库,我可以编写如下代码:

var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();

到目前为止一切顺利。现在我想在DomainEntity中写一个方法返回任何特定域实体的处理器。像这样:

public Processor<T> CreateProcessor<T>()
where T: DomainEntity
{
var pro = Processor<T>.Create((T)this);
return pro;
}

这个方法可以这样使用:

var pkg = Package.Create(/* various arguments */);
var pro = pkg.CreateProcessor<Package>();
pro.DoStuff();

这很好用,但我找到了 Package调用中的引用 CreateProcessor()有点多余,因为我在 Package 的实例上调用该方法因此对于类型参数应该引用哪个类没有歧义。但是,这不会编译:

var pkg = new Package(/* various arguments */);
var pro = pkg.CreateProcessor(); //<-- this does not compile.
pro.DoStuff();

我的问题是:

是否有另一种方式来编写 CreateProcessor()方法,以便编译器从调用它的对象中推断出类型参数?

我可以按需提供完整的 Visual Studio 项目。

最佳答案

您只需要创建一个通用的扩展方法:

public static class EntityExtensions
{
public static Processor<T> CreateProcessor<T>(this T entity)
where T : DomainEntity
=> new Processor<T>(entity);
}

这应该允许您很好地使用类型推断:

var package = new Package();
var processor = package.CreateProcessor();

第二行相当于:

var processor = EntityExtensions.CreateProcessor<Package>(package);

关于c# - 在方法中推断类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56858161/

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