正在为我的应用程序中的阻止程序寻求帮助。
对于某些情况,这是我完成的另一个问题的后续操作: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
从我的角度来看,这应该可行,因为实例化对象尊重并实现了此接口。
能否请您向我阐明一下这个问题,这在某种程度上阻止了我进一步进行:(
谢谢
答案 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);
}