更新时间:2022-10-17 23:36:32
一种特定类型的通用方法。对于C ++的模板,这是可能的,但对于C#的泛型是不可能的。
为了让你的代码能够编译,把它改为:
public override Document< TDTO,TActionType> ProcessDocument< TDTO,TActionType>(文档< TDTO,TActionType>文档)
将覆盖所有泛型参数的基类型方法。
如果您想为一种类型提供特殊实现,则可以添加非泛型重载和内部调用在特殊处理后的通用版本:
public Document< GenericDatabaseDTO,GenericDatabaseConstants.ActionType> ProcessDocument(文档< GenericDatabaseDTO,GenericDatabaseConstants.ActionType>文档)
{
//在这里对这个特殊情况进行一些特殊处理...
return base.ProcessDocument(document);
$ / code>
然而,请注意,这将会破坏像这样的多态: / p>
假设上述方法在 Derived
中实现。 派生
源自 Base
GenericDatabaseDTO dto = /*...*/;
GenericDatabaseConstants.ActionType actionType = /*...*/;
派生的d = new Derived();
基数b = d;
//通过Derived特殊处理调用非通用版本:
d.ProcessDocument(dto,actionType);
//从Base调用通用版本:
b.ProcessDocument(dto,actionType);
public abstract class BaseDocumentLayer : IDocumentLayer
{
public IDocumentLayer NextLayer { get;set;}
public virtual Document<T, U> ProcessDocument<T, U>(Document<T, U> document) {
if(NextLayer != null)
document = NextLayer.ProcessDocument(document);
return document;
}
}
public override Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{
return base.ProcessDocument<GenericDatabaseDTO,
}
public static class GenericDatabaseConstants
{
public enum ActionType
{
CreateGeneric,
ReadGeneric,
UpdateGeneric,
DeleteGeneric,
}
}
Why do I get the error: Type paramter declaration must be an identifier not a type?
Error1:
public override Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{
return base.ProcessDocument(document);
}
Error 1 'GenericDocumentLayer2.Document.GenericDatabase.ProcessLayer.ProcessDocument(GenericDocumentLayer2.TypeDefinition.Document)': no suitable method found to override
I have not changed my origin BaseLayer.ProcessDocument method
UPDATE
public void Add(GenericDatabaseField field) {
var dto = new GenericDatabaseDTO();
dto.Field = field;
dto.Id = "test";
var document = new Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(dto, GenericDatabaseConstants.ActionType.CreateGeneric, null);
IDocumentLayer layer = DocumentFactory.CreateDocumentLayers();
// The generic ProcessDocument is never called just the base version
document = layer.ProcessDocument<GenericDatabaseDTO, GenericDatabaseConstants.ActionType>(document);
}
You can't override a generic method for a specific type. This is possible with C++'s templates but not with C#'s generics.
To make your code compile, change it to this:
public override Document<TDTO, TActionType> ProcessDocument<TDTO, TActionType>(Document<TDTO, TActionType> document)
This will compile, but it will override the base type method for all generic arguments.
If you want to provide a special implementation just for one type, you can add a non-generic overload and internally call the generic version after the special handling:
public Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{
// some special handling for this special case here...
return base.ProcessDocument(document);
}
However, please note that this will break in polymorphic scenarios like this one:
Assume the methods above are implemented in Derived
. Derived
is derived from Base
GenericDatabaseDTO dto = /*...*/;
GenericDatabaseConstants.ActionType actionType = /*...*/;
Derived d = new Derived();
Base b = d;
// calls the non-generic version with special handling from Derived:
d.ProcessDocument(dto, actionType);
// calls the generic version from Base:
b.ProcessDocument(dto, actionType);