C# 方法中类型参数的推断

C# 方法中类型参数的推断,c#,generics,methods,extension-methods,C#,Generics,Methods,Extension Methods,我的C#库中有一个表示域实体的类的层次结构,所有这些类最终都是从名为DomainEntity的根抽象类降下来的。例如包或客户。我在每个类中使用Create()工厂方法来创建实例。我还有一个通用处理器类processor,其中T:DomainEntity。该处理器类还使用工厂方法进行实例化,并执行依赖于特定类的业务逻辑,因此其类型参数也是如此。例如,使用此库,我可以编写如下代码: var pkg = Package.Create(/* various arguments */); var pro

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

var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();
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();
此方法可按如下方式使用:

var pkg = Package.Create(/* various arguments */);
var pro = Processor<Package>.Create(pkg);
pro.DoStuff();
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()
方法,以便编译器从调用类型参数的对象推断类型参数


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

使用工厂方法如何:

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

// Usage
CreateProcessor<Package>().DoStuff();
静态处理器CreateProcessor(){
var package=新包();
T pro=package.CreateProcessor();
return-pro;
}
//用法
CreateProcessor().DoStuff();

不久前,我试图找到一种安静地使用类型专门化的方法,并发现这在C#中不起作用。您可以选中

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

public static class EntityExtensions
{
    public static Processor<T> CreateProcessor<T>(this T entity)
        where T : DomainEntity
        => new Processor<T>(entity);
}
第二行相当于:

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

您的“泛型类型推断在这里工作”让我感到困惑,因为类型推断不是为构造函数执行的。目前,您似乎正在构造一个非泛型处理器类的实例。请你提供一份清单好吗?这将使帮助你变得容易得多。@JonSkeet:你说得对。在从VisualStudio复制和粘贴时,我过度简化了代码。我将很快用一个工作版本更新它。抱歉。我怀疑一种扩展方法对你有用,但我宁愿等到我有了一个具体的例子来尝试它…@JonSkeet:我希望它现在更清楚了。是的,肯定的。答案来了……这就是@Cesargo试图避免的。请仔细阅读。正确,因为C#中的打字特化在您进入调用层次结构时不起作用。