c#将函数赋值给事件

本文关键字:事件 赋值 函数 | 更新日期: 2023-09-27 18:09:01

我正在尝试创建一个文件助手实用程序,我在分配函数到事件的问题。上面写着不可转让。

事件和委托签名如下

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

代码如下

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

    }

我得到了fileEngine.AfterReadRecord += afterReadFunc;

处的不可赋值误差

有人能帮帮忙吗

c#将函数赋值给事件

我已经稍微削减了你的代码,但问题是AfterReadHandler<T>不是Func<EngineBase, AfterReadEventArgs<T>>(也不是Action<EngineBase, AfterReadEventArgs<T>>)。

你有两个选择来修复你的代码。

(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;
}

如果还不够清楚,请告诉我。

据我所知,你正在使用Func<T, TResult>委托第二个参数是结果,它与AfterReadHandler委托不一样。

你可以尝试使用Action<T1, T2> Delegate代替。

参考文献:函数在msdn中,msdn

中的操作