gpt4 book ai didi

c# - FileHelpers 将事件处理程序解释为字段

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:47 27 4
gpt4 key购买 nike

我有一个从网络服务中使用的类,我正尝试使用 FileHelpers 库将其导出到 csv。但是该类有一个 PropertyChangedEventHandler 引擎正在将其读取为一个字段,所以我得到以下异常

{"The field: 'PropertyChanged' of type: PropertyChangedEventHandler is a non system type, so this field need a CustomConverter (see the docs for more info)."}

我尝试添加 FieldIgnored 属性,但随后我收到编译器错误,指出该属性仅对字段声明有效

有没有办法让引擎忽略事件处理程序?还是我必须将 Web 服务调用的结果转换为一个全新的(全部相同的类)?

任何想法

最佳答案

您的问题的出现是由于 C# 自动实现 事件 的方式的组合,以及您用来专门检测这种情况并提供更有用的错误消息的库的失败。

特别是,当您声明时:

public event PropertyChangedEventHandler PropertyChanged;

你在类里面真正得到的是这样的:

private PropertyChangedEventHandler PropertyChanged;

public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}

addremove 方法的具体实现多年来一直在变化。事实上,以上只是为了示例……编译器从未真正实现过完全一样的事件。重要的是您同时 获得了同名的事件和字段。图书馆正在查找该字段并对其进行投诉。

您应该能够通过自己显式实现事件来解决这个问题。例如:

[FieldIgnored]
private PropertyChangedEventHandler PropertyChangedField;

public event PropertyChangedEventHandler PropertyChanged
{
add { PropertyChanged += value; }
remove { PropertyChanged -= value; }
}

只要您不需要 addremove 方法是线程安全的,这就可以正常工作。但是,请注意 C# 编译器确实将事件 addremove 方法实现为线程安全的;如果你想遵循 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);
}
}

关于c# - FileHelpers 将事件处理程序解释为字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com