首页 > 解决方案 > 无法投射到界面

问题描述

寻找一些关于我在我的应用程序中遇到的阻止程序的帮助。

在某些情况下,这是我完成的另一个问题的后续行动: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>”,它会导致强制转换失败。

从我的角度来看,这应该可以工作,因为实例化的对象尊重并实现了这个接口。

你能否让我对这个主题有所了解,这在某种程度上阻止了我进一步进行:(

谢谢

标签: c#.net-core

解决方案


留下我所做的改变来完成这项工作。

感谢@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);
    }

推荐阅读