在方法中推断类型参数
Inferring type parameter in method
我的 C# 库中有一个 classes 的层次结构,表示域实体,所有最终都从名为 DomainEntity
的根抽象 class 下降。一些示例是 Package
或 Customer
。我在每个 class 中使用 Create()
工厂方法来创建实例。我还有一个通用处理器 class Processor<T>
,其中 T: DomainEntity
。此处理器 class 还使用工厂方法进行实例化并执行依赖于特定 class 的业务逻辑,因此它的类型参数。使用这个库,我可以编写这样的代码:
var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();
到目前为止一切顺利。现在我想在 DomainEntity
中编写一个方法,该方法 returns 是任何特定域实体的处理器。像这样:
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();
这工作正常,但我发现 CreateProcessor()
调用中的 Package
引用有点多余,因为我在 Package
的实例上调用该方法,因此关于 class 类型参数应该引用哪个是没有歧义的。但是,这不会编译:
var pkg = new Package(/* various arguments */);
var pro = pkg.CreateProcessor(); //<-- this does not compile.
pro.DoStuff();
我的问题是:
是否有另一种方法来编写 CreateProcessor()
方法,以便编译器从调用它的对象中推断出类型参数?
我可以根据需要提供完整的工作 Visual Studio 项目。
使用工厂方法怎么样:
static Processor<T> CreateProcessor<T>() {
var package = new Package();
T pro = package.CreateProcessor<T>();
return pro;
}
// Usage
CreateProcessor<Package>().DoStuff();
我刚才试图找到一种使用 type-specialization 安静的方法,但发现这在 C# 中不起作用。您可以查看 this blog post
您只需要创建一个通用扩展方法:
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# 库中有一个 classes 的层次结构,表示域实体,所有最终都从名为 DomainEntity
的根抽象 class 下降。一些示例是 Package
或 Customer
。我在每个 class 中使用 Create()
工厂方法来创建实例。我还有一个通用处理器 class Processor<T>
,其中 T: DomainEntity
。此处理器 class 还使用工厂方法进行实例化并执行依赖于特定 class 的业务逻辑,因此它的类型参数。使用这个库,我可以编写这样的代码:
var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();
到目前为止一切顺利。现在我想在 DomainEntity
中编写一个方法,该方法 returns 是任何特定域实体的处理器。像这样:
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();
这工作正常,但我发现 CreateProcessor()
调用中的 Package
引用有点多余,因为我在 Package
的实例上调用该方法,因此关于 class 类型参数应该引用哪个是没有歧义的。但是,这不会编译:
var pkg = new Package(/* various arguments */);
var pro = pkg.CreateProcessor(); //<-- this does not compile.
pro.DoStuff();
我的问题是:
是否有另一种方法来编写 CreateProcessor()
方法,以便编译器从调用它的对象中推断出类型参数?
我可以根据需要提供完整的工作 Visual Studio 项目。
使用工厂方法怎么样:
static Processor<T> CreateProcessor<T>() {
var package = new Package();
T pro = package.CreateProcessor<T>();
return pro;
}
// Usage
CreateProcessor<Package>().DoStuff();
我刚才试图找到一种使用 type-specialization 安静的方法,但发现这在 C# 中不起作用。您可以查看 this blog post
您只需要创建一个通用扩展方法:
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);