我有一个我从Web服务中消耗的类,我尝试使用FileHelpers
库导出到csv。但是,该类有PropertyChangedEventHandler
引擎正在读取该字段,因此我得到以下异常
{"字段:' PropertyChanged'类型:PropertyChangedEventHandler是 非系统类型,因此该字段需要CustomConverter(请参阅文档 了解更多信息)。"}
我已尝试添加FieldIgnored
属性,但后来我收到编译错误,说该属性仅对字段声明有效
有没有办法让引擎忽略事件处理程序?或者我是否必须将Web服务调用的结果转换为全新的(都是相同的类)?
任何想法
答案 0 :(得分:1)
由于C#自动实现private PropertyChangedEventHandler PropertyChanged;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}
的方式和您用于专门检测此方案的库的故障并提供更有用的错误消息,因此出现问题。
特别是,当您声明:
add
你班上真正得到的是:
remove
多年来,[FieldIgnored]
private PropertyChangedEventHandler PropertyChangedField;
public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}
和add
方法的确切实施发生了变化。实际上,上面仅仅是为了示例......编译器实际上从未真正实现过这样的事件。重要的是你得到两个一个事件和一个具有相同名称的字段。图书馆正在寻找这个领域并抱怨它。
您应该能够通过自己明确地实现事件来解决问题。例如:
remove
只要您不需要add
和remove
方法是线程安全的,这将正常工作。但请注意,C#编译器确实将事件[FieldIgnored]
private PropertyChangedEventHandler PropertyChangedField;
public event PropertyChangedEventHandler PropertyChanged
{
add
{
PropertyChangedEventHandler eventHandler = this.PropertyChangedField;
PropertyChangedEventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<PropertyChangedEventHandler>(
ref this.PropertyChangedField,
(PropertyChangedEventHandler) Delegate.Combine(
(Delegate) comparand, (Delegate) value),
comparand);
} while (eventHandler != comparand);
}
remove
{
PropertyChangedEventHandler eventHandler = this.PropertyChangedField;
PropertyChangedEventHandler comparand;
do
{
comparand = eventHandler;
eventHandler = Interlocked.CompareExchange<PropertyChangedEventHandler>(
ref this.PropertyChangedField,
(PropertyChangedEventHandler) Delegate.Remove(
(Delegate) comparand, (Delegate) value),
comparand);
} while (eventHandler != comparand);
}
}
和createBlock()
方法实现为线程安全的;如果你想要遵循C#编译器的模式,你会想要这样的东西:
setTemplate()
答案 1 :(得分:0)
FileHelpers类只是使用有限的C#语法作为定义语言来定义平面文件规范的一种方法。因此,FileHelpers类是一种不寻常的类型,您不应该尝试以任何其他方式使用它。
或者我将不得不转换Web服务调用的结果 进入一个全新的(都是相同的类)?
是的!这是推荐的方法。将FileHelpers类视为&#39;规范&#39;仅限CSV格式。这应该是它唯一的作用。
如果您需要更正常的记录&#39;对象(在您的情况下,您的Web服务类与事件),然后导入后映射结果。这可以通过以下方式轻松完成:
FileHelperEngine engine = new FileHelperEngine<FileHelpersOrder>();
var records = engine.ReadFile("FileIn.txt");
var niceOrders = records.Select(
x => new NiceOrder()
{ Number = x.Number,
Customer = x.Customer
// etc.
});
其中FileHelpersOrder
是您的CSV规范,NiceOrder
类是您的Web服务类正确的OOP类,其中包含必要的属性,方法等。
(注意:这允许CSV格式与目标对象有很大不同。想象一下,例如,你从一个数十种格式导入一小部分列。这种方法可以让你把事情分开。)
如果您要导出,那么您需要执行相反的操作,即,从FileHelpersOrder
的集合中选择NiceOrder
的集合。