C# 如果接口位于外部DLL中,则扩展接口
我使用asp.net MVC应用程序,该应用程序中有一个接口 但该接口位于第三方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
#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);
}