2016-09-27 4 views
1

filehelperユーティリティを作成しようとしていますが、Funcをイベントに割り当てる際に問題が発生しています。それは割り当て不可能だと言います。C#イベントにFuncを割り当てる

イベントと署名を委任誰かが助けることができる私はfileEngine.AfterReadRecord += afterReadFunc;

で非割り当て可能なエラーを取得しています

public class FileHelperUtility<T> where T : class 
    { 

     public List<T> ParseFile<T>(string fileName, ImportFileError fileError,Func<EngineBase, AfterReadEventArgs<T> > afterReadFunc) where T : class 
     { 
      List<T> records = new List<T>(); 
      var fileEngine = InitializeFileEngine<T>(afterReadFunc); 
      records = fileEngine.ReadFile(fileName).ToList(); 
      if (ValidateHeader(fileEngine.HeaderText)) 
      { 
       fileError.ErrorType = ImportFileFaultType.InvalidHeaderRecordType; 
       fileError.ErrorMessage = "No header record in the file."; 
      } 
      else 
      { 
       PopulateErrors(fileError, fileEngine.ErrorManager); 
      } 
      return records; 
     } 

     private FileHelperEngine<T> InitializeFileEngine<T>(Func<EngineBase, AfterReadEventArgs<T>> afterReadFunc) where T : class 
     { 
      var fileEngine = new FileHelperEngine<T>(Encoding.Default); 
      fileEngine.ErrorMode = ErrorMode.SaveAndContinue; 
      if (afterReadFunc != null) 
      { 
       fileEngine.AfterReadRecord += afterReadFunc; 
      } 
      return fileEngine; 
     } 


     private void PopulateErrors(ImportFileError fileError, ErrorManager errorManager) 
     { 
      if (errorManager.Errors.Count() > 0) 
      { 
       fileError.ErrorType = ImportFileFaultType.InvalidDetailRecordType; 
       fileError.ErrorData = new List<string>(); 
      } 
      foreach (var error in errorManager.Errors) 
      { 
       string errorString = string.Format("Line:{0} Field:{1} - ErrorInfo:{2}", 
        error.LineNumber, 
        ((ConvertException)error.ExceptionInfo).FieldName, 
        error.ExceptionInfo.InnerException); 
       fileError.ErrorData.Add(errorString); 
      } 

     } 
     private bool ValidateHeader(string headerRecord) 
     { 
      bool isheaderValid; 
      if (!string.IsNullOrEmpty(headerRecord) && 
       !string.IsNullOrEmpty(headerRecord.Trim(new char[] { '\r', '\n' }))) 
      { 
       isheaderValid = true; 
      } 
      else 
      { 
       isheaderValid = false; 
      } 
      return isheaderValid; 
     } 



    } 

以下のよう

public event AfterReadHandler<T> AfterReadRecord 
public delegate void AfterReadHandler<T>(EngineBase engine, fterReadEventArgs<T> e); 

以下のようなコードがありますさ。

+2

'Func <...>'ではなく 'Action <...>'が必要です。 –

+0

あなたの質問には、コンパイルするのが非常に難しいコードが含まれています。私たちが仕事をするには本当に[mcve]を提供する必要があります。 – Enigmativity

答えて

2

私がダウンして少しあなたのコードをカットしましたが、問題はAfterReadHandler<T>Func<EngineBase, AfterReadEventArgs<T>>ではありません(またそれがAction<EngineBase, AfterReadEventArgs<T>>であるということです

あなたが持っています。あなたのコードを修正するには、2つの選択肢。

(1)

private FileHelperUtility<T> InitializeFileEngine<T>(AfterReadHandler<T> afterReadFunc) where T : class 
{ 
    var fileEngine = new FileHelperUtility<T>(); 
    if (afterReadFunc != null) 
    { 
     fileEngine.AfterReadRecord += afterReadFunc; 
    } 
    return fileEngine; 
} 

(2)

private FileHelperUtility<T> InitializeFileEngine<T>(Action<EngineBase, AfterReadEventArgs<T>> afterReadFunc) where T : class 
{ 
    var fileEngine = new FileHelperUtility<T>(); 
    if (afterReadFunc != null) 
    { 
     fileEngine.AfterReadRecord += (eb, area) => afterReadFunc(eb, area); 
    } 
    return fileEngine; 
} 

、これは十分に明確でない場合は、私に教えてください。

+0

これは役に立ちます。私は最小の完全な例を作るでしょう。ありがとうございます。 –

0

Func<T, TResult>を使用していることを理解しています。2番目のパラメータは、AfterReadHandlerデリゲートと同じではありません。

Action<T1, T2>代理人を代わりに使用できますか。ここ

参考文献: Func in msdnAction in msdn

+0

FuncをActionに変更すると、このエラーが表示されます。 'System.Action >'を 'FileHelpers.Events.AfterReadHandler ' –

+0

に暗黙のうちに変換できません。 –

関連する問題