Ces*_*Gon 3 c# generics methods extension-methods
我的C#库中有一个表示域实体的类层次结构,所有这些类最终都来自名为的根抽象类DomainEntity。一些示例是Package或Customer。我Create()在每个类中使用工厂方法来创建实例。我也有一个通用处理器类Processor<T>where T: DomainEntity。该处理器类还使用要实例化的工厂方法,并执行取决于特定类(因此取决于其类型参数)的业务逻辑。使用这个库,我可以例如编写如下代码:
var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。现在,我想编写一个方法,DomainEntity该方法为任何特定的域实体返回处理器。像这样:
public Processor<T> CreateProcessor<T>()
where T: DomainEntity
{
var pro = Processor<T>.Create((T)this);
return pro;
}
Run Code Online (Sandbox Code Playgroud)
这种方法可以这样使用:
var pkg = Package.Create(/* various arguments */);
var pro = pkg.CreateProcessor<Package>();
pro.DoStuff();
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是我Package在调用中找到了对引用的CreateProcessor()冗余,因为我在实例上调用方法Package,因此对于类型参数应引用的类没有任何歧义。但是,这将无法编译:
var pkg = new Package(/* various arguments */);
var pro = pkg.CreateProcessor(); //<-- this does not compile.
pro.DoStuff();
Run Code Online (Sandbox Code Playgroud)
我的问题是:
有没有另一种方法可以编写该CreateProcessor()方法,以便编译器从调用它的对象中推断出类型参数?
我可以按需提供完整的Visual Studio项目。
您只需要创建一个通用扩展方法:
public static class EntityExtensions
{
public static Processor<T> CreateProcessor<T>(this T entity)
where T : DomainEntity
=> new Processor<T>(entity);
}
Run Code Online (Sandbox Code Playgroud)
那应该允许您使用类型推断就好了:
var package = new Package();
var processor = package.CreateProcessor();
Run Code Online (Sandbox Code Playgroud)
第二行等效于:
var processor = EntityExtensions.CreateProcessor<Package>(package);
Run Code Online (Sandbox Code Playgroud)