Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何在泛型方法中使用自定义扩展_C#_Generics_Interface - Fatal编程技术网

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();
}
}
或者你不能