无法投射到界面

时间:2020-08-03 12:34:34

标签: c# .net-core

正在为我的应用程序中的阻止程序寻求帮助。

对于某些情况,这是我完成的另一个问题的后续操作: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 ”,则它会失败演员。

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

能否请您向我阐明一下这个问题,这在某种程度上阻止了我进一步进行:(

谢谢

1 个答案:

答案 0 :(得分:1)

离开我所做的更改以使其正常工作。

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