C# 如果接口位于外部DLL中,则扩展接口

C# 如果接口位于外部DLL中,则扩展接口,c#,asp.net-mvc,interface,C#,Asp.net Mvc,Interface,我使用asp.net MVC应用程序,该应用程序中有一个接口 但该接口位于第三方DLL中。所以我不能修改界面 #region Assembly Sana.Commerce, Version=9.1.3.0, Culture=neutral, PublicKeyToken=2b26dc7ce8e04e9f // D:\visualstudio2015\Sana Training\SDK\SDK\Libraries\Sana.Commerce.dll #endregion using System

我使用asp.net MVC应用程序,该应用程序中有一个接口

但该接口位于第三方DLL中。所以我不能修改界面

#region Assembly Sana.Commerce, Version=9.1.3.0, Culture=neutral, PublicKeyToken=2b26dc7ce8e04e9f
// D:\visualstudio2015\Sana Training\SDK\SDK\Libraries\Sana.Commerce.dll
#endregion

using System;
using System.Collections.Generic;
using Sana.Commerce.Customer;
using Sana.Commerce.Shop;

namespace Sana.Commerce.Order
{
    //
    // Summary:
    //     This interface represents an order in the ERP system. This can be an order that
    //     still has to be placed or an order that is already in the ERP (for example order
    //     history). There are several types of orders like regular orders, invoice and
    //     quotes. The type of order is stored in the document type property.
    public interface IOrder : IEntity, IVersionedItem
    {
        //
        // Summary:
        //     ID of the account that placed the order.
        string AccountId { get; set; }
        //
        // Summary:
        //     The type of account that placed this order.
        AccountType AccountType { get; set; }
        //
        // Summary:
        //     Gets or sets the list of order attachments.
        IList<IAttachment> Attachments { get; set; }
        //
        // Summary:
        //     Gets or sets the status of order authorization.
        OrderAuthorizationStatus AuthorizationStatus { get; set; }
        //
        // Summary:
        //     Address that will recieve the invoice.
        ICustomerAddress BillingAddress { get; set; }
        //
        // Summary:
        //     Gets or sets bill-to name.
        string BillToName { get; set; }
        //
        // Summary:
        //     Gets or sets the comment.
        string Comment { get; set; }
        //
        // Summary:
        //     Name of the Contact that placed this order.
        string Contact { get; set; }
        //
        // Summary:
        //     ID of the Contact that placed this order.
        string ContactId { get; set; }
    }
}
但是我有一个方法,像这样:

public  interface IOrderProjectNumber:IOrder
{
    string ProjectNumber { get; set; }

}
public override IOrder SaveOrder(IOrder order)
{

    IOrderProjectNumber orderNumber= new OrderoverviewModel_ProjectNumber();
    orderNumber.ProjectNumber = "hallo";     

    return base.SaveOrder(order);
}
public class Addon : IAddon
    {
        public int Order
        {
            get { return 0; }
        }

        public void Initialize()
        {
            ObjectManager.RegisterType<IController, ReturnOrdersController>("ReturnOrders");
            ObjectManager.RegisterType<OrderOverviewModel, OrderoverviewModel_ProjectNumber>();
        }
    }
因此,我用以下内容更改方法:

public override IOrder SaveOrder(IOrderProjectNumber order)
{

    IOrderProjectNumber orderNumber= new OrderoverviewModel_ProjectNumber();
    orderNumber.ProjectNumber = "hallo";     

    return base.SaveOrder(order);
}
但是我得到了一个错误:

代码说明项目文件行列抑制状态 CS0115“ExtendedOrderManager.SaveOrder(IOrderProjectNumber)”:否 找到合适的方法 覆盖Sana.Commerce.Sdk D:\visualstudio2015\Sana Training\SDK\SDK\Sana.Commerce.SDK\Customization\Order\ExtendedOrderManager.cs 19 32处于活动状态

它将像xml一样保存:

<Order>
  <field name="BlanketOrderId" type="System.String, mscorlib" storeWithEntity="True">
    <string>BO1</string>
  </field>
  <field name="CustomField" type="System.String, mscorlib" storeWithEntity="False">
    <string>myvalue</string>
  </field>
  <field name="PaymentStatus" type="System.String, mscorlib">
    <string>new</string>
  </field>
  <field name="ProjectNumber" type="Null" />
  <field name="BillingAddress" type="Sana.Commerce.Customer.CustomerAddress, Sana.Commerce.Sdk">
    <CustomerAddress>
      <field name="CustomerId" type="System.String, mscorlib">
        <string>01454545</string>
      </field>
      <field name="Address" type="System.String, mscorlib">
        <string>705 West Peachtree Street</string>
      </field>
      <field name="Address2" type="System.String, mscorlib">
        <string />
      </field>
      <field name="ZipCode" type="System.String, mscorlib">
        <string>US-GA 31772</string>
      </field>
      <field name="City" type="System.String, mscorlib">
        <string>Atlanta</string>
      </field>
      <field name="CountryId" type="System.String, mscorlib">
        <string>US</string>
      </field>
      <field name="CountryName" type="System.String, mscorlib">
        <string>Verenigde Staten</string>
      </field>
      <field name="State" type="System.String, mscorlib">
        <string />
      </field>
      <field name="PhoneNo" type="System.String, mscorlib">
        <string />
      </field>
      <field name="FaxNo" type="System.String, mscorlib">
        <string />
      </field>
      <field name="Contact" type="System.String, mscorlib">
        <string>Ms. Tammy L. McDonald</string>
      </field>
      <field name="ContactId" type="Null" />
      <field name="Name" type="System.String, mscorlib">
        <string>New Concepts Furniture</string>
      </field>
      <field name="Id" type="Null" />
      <field name="WebsiteId" type="Null" />
    </CustomerAddress>
  </field>
这仍然是空的:

public  interface IOrderProjectNumber : IOrder
    {
        string ProjectNumber { get; set; }
        //public virtual IOrder SaveOrder(IOrder order);

    }

 var orderObject = order as DomainModel.Order.IOrderProjectNumber;

orderObject仍然为空。我不明白。

您的保存顺序方法应该如下所示:

public override IOrder SaveOrder(IOrder order)
{    
    var orderObject = order as Order;

    if(orderObject != null)
    {
        orderObject.ProjectNumber = "hallo";     
    }

    return base.SaveOrder(order);
}

您必须使用给定的IOrder接口吗?您可以将其子类化,并在子类化接口中声明所需的成员。谢谢。我更新了postYou无法使用其他类型参数覆盖的postYou。您仍然必须接受
IOrder
。您可以通过检查重写方法中的另一个接口是否实现该接口来“搜索”,但不幸的是,您不能要求该参数成为新的接口类型。简言之,完全类型安全性并不能真正满足您的需求。作为一个补充,为什么要使用接口来实现这一点?为什么不直接执行
var orderNumber=new orderoverview model_ProjectNumber();orderNumber.ProjectNumber=“你好”?这应该允许您在不通过接口的情况下设置对象的属性。此对象必须实现
IOrder
,因此与
base.SaveOrder
兼容。然而,既然在方法中构造一个新对象,那么参数的用途是什么呢?简而言之,当我们真的不知道您为什么要做这些事情时,很难给您提供好的建议。请回到第一个版本,
SaveOrder(IOrder order)
。但是看看内容,orderNumber和order之间没有连接或交换。谢谢您的评论。但是orderNumber现在为null仍然为null我的意思是,如果基础对象没有实现
IOrderProjectNumber
,那么是的,这将是
null
。谁是SaveOrder方法的调用者,您是发起调用还是它源自第三部分组件?您还应该澄清这个问题,输入参数(order)是在哪里实例化的。然后您必须更改(m.b.重写)instanceIn方法,并返回和实例来实现继承的接口。完成此部分后,SaveMethod的输入参数也将实现IOrderProjectNumber接口,并且一切正常。在不了解应用程序体系结构的情况下,给您一个有效的答案有点困难。我想您的意思是:
按IOrderProjectNumber排序
public  interface IOrderProjectNumber : IOrder
    {
        string ProjectNumber { get; set; }
        //public virtual IOrder SaveOrder(IOrder order);

    }

 var orderObject = order as DomainModel.Order.IOrderProjectNumber;
public override IOrder SaveOrder(IOrder order)
{    
    var orderObject = order as Order;

    if(orderObject != null)
    {
        orderObject.ProjectNumber = "hallo";     
    }

    return base.SaveOrder(order);
}