c#如何在泛型方法中使用自定义扩展
我有一些复制的代码,因此希望创建一个通用方法。我有一个常用的命名扩展方法,我想在这个方法中使用它。通常,如果它不是扩展方法,我会创建一个接口,通过该接口限制泛型参数类,然后您可以使用该通用方法。但这不适用于扩展方法 以下是我的通用方法:c#如何在泛型方法中使用自定义扩展,c#,generics,interface,C#,Generics,Interface,我有一些复制的代码,因此希望创建一个通用方法。我有一个常用的命名扩展方法,我想在这个方法中使用它。通常,如果它不是扩展方法,我会创建一个接口,通过该接口限制泛型参数类,然后您可以使用该通用方法。但这不适用于扩展方法 以下是我的通用方法: public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity, TQuickbooksEntity>(TExternalEntity entity, Compan
public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity, TQuickbooksEntity>(TExternalEntity entity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, IFinancials, IExternalMapper<TExternalEntity, TQuickbooksEntity>, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
return CreateUpdateQuickBooksEntity<TQuickbooksEntity>(
entity.ToQuickBooksEntity(preferences),
x => x.Id == entity.FinancialsId,
entity.FinancialsId);
}
还有这个
public static class VendorExtensions : IExternalMapper<OTIS.Domain.InventoryMgmt.Vendor, Intuit.Ipp.Data.Vendor>
{
public static Intuit.Ipp.Data.Vendor ToQuickbooksEntity(this OTIS.Domain.InventoryMgmt.Vendor importedVendor)
公共静态类VendorExtensions:IExternalMapper
{
公共静态Intuit.Ipp.Data.Vendor到QuickBooksEntity(此OTIS.Domain.InventoryMgmt.Vendor导入的Vendor)
导致静态类无法实现接口
我理解为什么这不起作用,但我不知道如何重新构建代码,以支持在泛型方法中使用扩展方法的需求
扩展方法必须在非泛型静态类中定义
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
错误不是很清楚吗?扩展方法应该是一个静态方法,应该在非泛型静态类中定义它才能工作。此外,静态类必须继承自System.Object
,并且不能实现任何接口
接口
实现在静态类中是非法的,因为静态类不能有实例成员,但没有实例成员接口就没有意义
扩展方法必须在非泛型静态类中定义
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
错误不是很清楚吗?扩展方法应该是一个静态方法,应该在非泛型静态类中定义它才能工作。此外,静态类必须继承自System.Object
,并且不能实现任何接口
接口
实现在静态类中是非法的,因为静态类不能有实例成员,但没有实例成员接口就没有意义。它们基本上总结为
扩展方法必须在非泛型静态类中定义
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
只需在静态类中定义扩展方法
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
公共静态类MapperExtensions
{
公共静态TQuickbooksEntity到QuickBooksEntity(此文本属性外部实体,公司参考财务系统通用首选项)
其中texternality:class,OTIS.Domain.ienty,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
//返回do实现
}
}
然后,当您想要映射它时,请去掉接口并直接使用扩展
using namespacetoextensions;
public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity, TQuickbooksEntity>(TExternalEntity entity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, IFinancials, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
return CreateUpdateQuickBooksEntity<TQuickbooksEntity>(
entity.ToQuickBooksEntity(preferences),
x => x.Id == entity.FinancialsId,
entity.FinancialsId);
}
使用名称空间扩展;
公共行动确认CreateUpdateEntity(文本实体、公司参考财务系统通用首选项)
其中texternality:class,OTIS.Domain.ienty,IFinancials,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
返回CreateUpdateCheckBooksEntity(
实体。ToQuickBooksEntity(首选项),
x=>x.Id==entity.FinancialsId,
实体名称(FinancialID);
}
只是想澄清一下,您试图以一种根本不起作用的方式使用C#功能
静态类是密封的,因此不能被继承
无法从对象以外的任何类继承
这意味着使用扩展方法实现接口很简单,无法正常工作
因此,您有两种选择,要么删除接口,要么直接使用扩展方法,如下所示:
public static class Extensions
{
public static TExternalEntity ToQuickBooksEntity<TExternalEntity, TQuickbooksEntity>(this TQuickbooksEntity externalEntity)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
throw new NotImplementedException();
}
}
公共静态类扩展
{
QuickBooksEntity的公共静态文本属性(此TQuickbooksEntity外部实体)
其中texternality:class,OTIS.Domain.ienty,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
抛出新的NotImplementedException();
}
}
或者,您不能使用扩展方法,而应该使用带有实现的接口。(我将非常直接地展示这个示例)。他们将其概括为
扩展方法必须在非泛型静态类中定义
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
只需在静态类中定义扩展方法
public static class MapperExtensions
{
public static TQuickbooksEntity ToQuickBooksEntity<TExternalEntity>(this TExternalEntity externalEntity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
//return do implimentation
}
}
公共静态类MapperExtensions
{
公共静态TQuickbooksEntity到QuickBooksEntity(此文本属性外部实体,公司参考财务系统通用首选项)
其中texternality:class,OTIS.Domain.ienty,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
//返回do实现
}
}
然后,当您想要映射它时,请去掉接口并直接使用扩展
using namespacetoextensions;
public ActionConfirmation<string> CreateUpdateEntity<TExternalEntity, TQuickbooksEntity>(TExternalEntity entity, CompanyPreferencesFinancialsSystemCommon preferences)
where TExternalEntity : class, OTIS.Domain.IEntity, IFinancials, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
return CreateUpdateQuickBooksEntity<TQuickbooksEntity>(
entity.ToQuickBooksEntity(preferences),
x => x.Id == entity.FinancialsId,
entity.FinancialsId);
}
使用名称空间扩展;
公共行动确认CreateUpdateEntity(文本实体、公司参考财务系统通用首选项)
其中texternality:class,OTIS.Domain.ienty,IFinancials,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
返回CreateUpdateCheckBooksEntity(
实体。ToQuickBooksEntity(首选项),
x=>x.Id==entity.FinancialsId,
实体名称(FinancialID);
}
只是想澄清一下,您试图以一种根本不起作用的方式使用C#功能
静态类是密封的,因此不能被继承
无法从对象以外的任何类继承
这意味着使用扩展方法实现接口很简单,无法正常工作
因此,您有两种选择,要么删除接口,要么直接使用扩展方法,如下所示:
public static class Extensions
{
public static TExternalEntity ToQuickBooksEntity<TExternalEntity, TQuickbooksEntity>(this TQuickbooksEntity externalEntity)
where TExternalEntity : class, OTIS.Domain.IEntity, new()
where TQuickbooksEntity : class, Intuit.Ipp.Data.IEntity, new()
{
throw new NotImplementedException();
}
}
公共静态类扩展
{
QuickBooksEntity的公共静态文本属性(此TQuickbooksEntity外部实体)
其中texternality:class,OTIS.Domain.ienty,new()
其中TQuickbooksEntity:class,Intuit.Ipp.Data.IEntity,new()
{
抛出新的NotImplementedException();
}
}
或者你不能