gpt4 book ai didi

c# - 对象在转换为接口(interface)时必须实现 IConvertible (InvalidCastException)

转载 作者:可可西里 更新时间:2023-11-01 08:48:38 26 4
gpt4 key购买 nike

我正在尝试将某种类型的对象转换为它使用 Convert.ChangeType() 实现的接口(interface), 但是 InvalidCastException被抛出是因为对象必须实现 IConvertible

类型:

public IDocumentSet : IQueryable {}

public IDocumentSet<TDocument> : IDocumentSet, IQueryable<TDocument> {}

public XmlDocumentSet<TDocument> : IDocumentSet<TDocument> {}

错误发生的代码摘录:

private readonly ConcurrentDictionary<Type, IDocumentSet> _openDocumentSets = new ConcurrentDictionary<Type, IDocumentSet>();

public void Commit()
{
if (_isDisposed)
throw new ObjectDisposedException(nameof(IDocumentStore));

if (!_openDocumentSets.Any())
return;

foreach (var openDocumentSet in _openDocumentSets)
{
var documentType = openDocumentSet.Key;
var documentSet = openDocumentSet.Value;

var fileName = GetDocumentSetFileName(documentType);
var documentSetPath = Path.Combine(FolderPath, fileName);

using (var stream = new FileStream(documentSetPath, FileMode.Create, FileAccess.Write))
using (var writer = new StreamWriter(stream))
{
var documentSetType = typeof (IDocumentSet<>).MakeGenericType(documentType);
var writeMethod = typeof (FileSystemDocumentStoreBase)
.GetMethod(nameof(WriteDocumentSet), BindingFlags.Instance | BindingFlags.NonPublic)
.MakeGenericMethod(documentSetType);
var genericDocumentSet = Convert.ChangeType(documentSet, documentSetType); <-------

writeMethod.Invoke(this, new[] {writer, genericDocumentSet});
}
}
}

现在,我无法理解为什么会发生这种情况(因为 XmlDocumentSet 不是值类型)和 XmlDocumentSet<'1>工具 IDocumentSet<'1> .我错过了什么吗?还是有更简单的方法来实现我正在做的事情?

最佳答案

IConvertible 接口(interface)旨在允许一个类安全地将自身转换为另一种类型。 Convert.ChangeType 调用使用该接口(interface)将一种类型安全地转换为另一种类型。

如果您在编译时不知道类型,那么您将被迫尝试运行时转换。这是在一个非常相似的问题中讨论的 Convert variable to type only known at run-time? .

关于c# - 对象在转换为接口(interface)时必须实现 IConvertible (InvalidCastException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39530369/

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