c# - 无法投射到界面
问题描述
寻找一些关于我在我的应用程序中遇到的阻止程序的帮助。
在某些情况下,这是我完成的另一个问题的后续行动:C# Validate that generic type extends generic abstract class with type parameters
关于这个问题,在我的项目中,整体结构如下:
public abstract class AbstractPlugin<TSignatureFile, TLoadedFile> :
IPlugin<TSignatureFile, TLoadedFile>
where TSignatureFile : IFileSignature
where TLoadedFile : LoadedFile { }
public interface IPlugin<out TSignatureFile, TLoadedFile>
where TSignatureFile : IFileSignature
where TLoadedFile : LoadedFile { }
public class MyPlugin : AbstractPlugin<MyPluginFileSignature, MyPluginFile { }
public class MyPluginFileSignature : IFileSignature { }
public class MyPluginFile : LoadedFile { }
这个“MyPlugin 是从我创建实例的外部 DLL 加载的:
var result = Activator.CreateInstance(type, notificationCallBack);
“notificationCallBack”是一个构造函数参数。
我遇到的问题是,即使根据类型、实现方式等检查所有内容,它看起来不错,但如果我尝试将这个“结果”对象强制转换为“IPlugin<IFileSignature,LoadedFile>”,它会导致强制转换失败。
从我的角度来看,这应该可以工作,因为实例化的对象尊重并实现了这个接口。
你能否让我对这个主题有所了解,这在某种程度上阻止了我进一步进行:(
谢谢
解决方案
留下我所做的改变来完成这项工作。
感谢@canton7 的帮助。
所以这实际上是一个差异问题。
我决定不再强制使用“LoadedFile”抽象类,而是将所有内容更改为使用接口,在本例中为“ILoadedFile”。
此外,将 IPlugin 更改为具有通用参数 TLoadedFile Covariant。这是有关我所做更改的更多详细信息,可能会对某人有所帮助。
为了使 TLoadedFile 协变,我还必须更改另一个使用该通用参数的接口,在本例中是 IFileService。
public interface IPlugin<out TSignatureFile, out TLoadedFile>
where TSignatureFile : IFileSignature
where TLoadedFile : ILoadedFile
{
...
public IFileService<TLoadedFile> FileService { get; }
...
}
public interface IFileService<out TLoadedFile> where TLoadedFile : ILoadedFile
{
public TLoadedFile NewFile(string filepath, string safeFileName);
}
推荐阅读
- ssis - 如何将二进制数据转换为文本,然后再返回
- matlab - 带有类方法的gpu上的matlab arrayfun
- ios - 以编程方式创建部分屏幕 UIPageViewController
- typescript - 如何为接口创建索引签名
- android - Android Studio 数据包解析问题 .apk
- javascript - requestFullscreen 后等待回流结束
- python - 循环遍历 2 个字典列表
- c# - AutoFixure Fixture.Build().With() 具有不同的值
- python - 在 2.0 的会话中迭代 tf.data.Dataset 的正确方法
- redis - 如何扫描自上次 SCAN 以来其值已更新的键