1
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,               
    }
}

エラーが発生するのはなぜですか: 型パラメーター宣言は型ではなく識別子でなければなりません?

ここに画像の説明を入力

エラー 1:

public override Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)
{   

    return base.ProcessDocument(document);
}

エラー 1 'GenericDocumentLayer2.Document.GenericDatabase.ProcessLayer.ProcessDocument(GenericDocumentLayer2.TypeDefinition.Document)': オーバーライドする適切なメソッドが見つかりません

元の BaseLayer.ProcessDocument メソッドを変更していません

アップデート

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);                
    }
4

1 に答える 1

1

特定の型のジェネリック メソッドをオーバーライドすることはできません。これは、C++ のテンプレートでは可能ですが、C# のジェネリックでは可能ではありません。

コードをコンパイルするには、次のように変更します。

public override Document<TDTO, TActionType> ProcessDocument<TDTO, TActionType>(Document<TDTO, TActionType> document) 

これはコンパイルされますが、すべてのジェネリック引数の基本型メソッドをオーバーライドします。

1 つの型だけに特別な実装を提供する場合は、非ジェネリック オーバーロードを追加し、特別な処理の後にジェネリック バージョンを内部的に呼び出すことができます。

public Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> ProcessDocument(Document<GenericDatabaseDTO, GenericDatabaseConstants.ActionType> document)  
{
    // some special handling for this special case here...

    return base.ProcessDocument(document);
}

ただし、これは次のような多態的なシナリオでは機能しないことに注意してください。

上記のメソッドが に実装されていると仮定しますDerivedDerivedから派生した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);
于 2012-08-28T10:33:33.410 に答える