C# 如何将泛型对象强制转换为MyType?

C# 如何将泛型对象强制转换为MyType?,c#,generics,casting,C#,Generics,Casting,我得到了错误 "Error 4 Cannot convert type 'TExternalEntity' to 'OTIS.Domain.InventoryMgmt.OrderHeader'" 为什么不呢?我确信它与定义泛型类型的where语句有关,但不确定如何解决这个问题 我们可以看到,我们正在测试该类型是否为OrderHeader类型,所以我们不能强制转换为OrderHeader public ActionConfirmation<string> CreateUpdat

我得到了错误

"Error  4   Cannot convert type 'TExternalEntity' to 'OTIS.Domain.InventoryMgmt.OrderHeader'"
为什么不呢?我确信它与定义泛型类型的
where
语句有关,但不确定如何解决这个问题

我们可以看到,我们正在测试该类型是否为
OrderHeader
类型,所以我们不能强制转换为
OrderHeader

public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity>
    (TExternalEntity entity, CompanyPreferencesFinancialsSystemCommon preferences)
        where TExternalEntity : class, OTIS.Domain.IEntity, IFinancials, new()
{

    //Determine TExternalEntity type (invoice, vendor, customer) to determine which
    //mapper class to create. Then convert TExternalEntity to TQuickbooksEntity.

    if (entity is InvoiceHeader)
    {
        var qbInvoice = new InvoiceMapper().ToQuickbooksEntity(entity as InvoiceHeader, preferences);

        return CreateUpdateQuickBooksEntity(
            qbInvoice,
            x => x.Id == entity.FinancialsId,   
            entity.FinancialsId);
    }

    if (entity is OrderHeader)
    {
        var orderHdr = (OrderHeader)entity; <------ ERROR HERE
        var qbSalesReceipt = orderHdr.ToQuickBooksEntity(preferences);

        return CreateUpdateQuickBooksEntity(
            qbInvoice,
            x => x.Id == entity.FinancialsId,
            entity.FinancialsId);
    }
公共操作确认CreateUpdateEntity
(文本实体、公司参考财务系统共同偏好)
其中texternality:class,OTIS.Domain.ienty,IFinancials,new()
{
//确定文本实体类型(发票、供应商、客户)以确定
//要创建的映射器类。然后将texternality转换为TQuickbooksEntity。
if(实体为发票抬头)
{
var qbInvoice=new InvoiceMapper().ToQuickbooksEntity(作为InvoiceHeader的实体,首选项);
返回CreateUpdateCheckBooksEntity(
qbInvoice,
x=>x.Id==entity.FinancialsId,
实体名称(FinancialID);
}
if(实体为OrderHeader)
{
var orderHdr=(OrderHeader)entity;x.Id==entity.FinancialsId,
实体名称(FinancialID);
}

您可能应该提到这是一个编译时错误,而不是运行时错误

编译器不知道您正在测试类型,因此它认为此强制转换可能会失败

评论中的任何一条建议都适用于您

如果您使用
(OrderHeader)(object)实体
,并且该实体不是OrderHeader(您知道它是,因为您首先要测试它,但请告诉我),那么您将在该行中得到一个错误

如果将
实体用作OrderHeader
,并且该实体不是OrderHeader,则orderHdr变量将设置为null,并将继续执行

我还将您的示例缩减到复制该问题所需的最低代码

public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity>(TExternalEntity entity)
{
    if (entity is OrderHeader)
    {
        var orderHdr = (OrderHeader)entity; //<------ ERROR HERE
    }

    return null;
}
public ActionConfirmation CreateUpdateEntity(文本实体)
{
if(实体为OrderHeader)
{

var orderHdr=(OrderHeader)entity;//您可能应该提到这是一个编译时错误,而不是运行时错误

编译器不知道您正在测试类型,因此它认为此强制转换可能会失败

评论中的任何一条建议都适用于您

如果您使用
(OrderHeader)(object)实体
,并且该实体不是OrderHeader(您知道它是,因为您首先要测试它,但请告诉我),那么您将在该行中得到一个错误

如果将
实体用作OrderHeader
,并且该实体不是OrderHeader,则orderHdr变量将设置为null,并将继续执行

我还将您的示例缩减到复制该问题所需的最低代码

public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity>(TExternalEntity entity)
{
    if (entity is OrderHeader)
    {
        var orderHdr = (OrderHeader)entity; //<------ ERROR HERE
    }

    return null;
}
public ActionConfirmation CreateUpdateEntity(文本实体)
{
if(实体为OrderHeader)
{

var orderHdr=(OrderHeader)entity;//如果确实需要此代码,请执行以下操作:(OrderHeader)((object)entity);也可以使用“entity as OrderHeader”是否
var orderHdr=entity as OrderHeader;
提供更好的结果?如果确实需要此代码,请执行以下操作:(OrderHeader)((object)entity);还可以使用“entity as OrderHeader”
var orderHdr=entity as OrderHeader;
是否提供了更好的结果?