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;
有人能帮帮忙吗
我已经稍微削减了你的代码,但问题是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