推断方法中的类型参数

时间:2019-07-02 18:21:13

标签: c# generics methods extension-methods

我的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项目。

2 个答案:

答案 0 :(得分:6)

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

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);

答案 1 :(得分:-1)

使用工厂方法怎么样:

static Processor<T> CreateProcessor<T>() {
    var package = new Package();
    T pro = package.CreateProcessor<T>();
    return pro;
}

// Usage
CreateProcessor<Package>().DoStuff();

前一段时间,我试图找到一种使用类型专用化静默的方法,并且发现这在C#中不起作用。您可以检查this blog post