C# 如何用接口ID之类的东西替换枚举? 请考虑以下接口: interface IFile { // Members }; interface IAudioFile : IFile { // Members }; interface IVideoFile : IFile { // Members }; enum ContentType { Audio, Video }; interface IProvider { HashSet<ContentType> GetSupportedTypes(); IList<IFile> GetFiles(ContentType contentType); }; 接口文件 { //成员 }; 接口IAudioFile:IFile { //成员 }; 接口文件:IFile { //成员 }; 枚举内容类型 { 音频 视频 }; 接口IProvider { HashSet GetSupportedTypes(); IList GetFiles(ContentType ContentType); };

C# 如何用接口ID之类的东西替换枚举? 请考虑以下接口: interface IFile { // Members }; interface IAudioFile : IFile { // Members }; interface IVideoFile : IFile { // Members }; enum ContentType { Audio, Video }; interface IProvider { HashSet<ContentType> GetSupportedTypes(); IList<IFile> GetFiles(ContentType contentType); }; 接口文件 { //成员 }; 接口IAudioFile:IFile { //成员 }; 接口文件:IFile { //成员 }; 枚举内容类型 { 音频 视频 }; 接口IProvider { HashSet GetSupportedTypes(); IList GetFiles(ContentType ContentType); };,c#,enumeration,interface-design,C#,Enumeration,Interface Design,我认为ContentType枚举是多余的。 有没有办法用接口标识符之类的东西来代替枚举类型 非常感谢对界面设计的任何评论。这实际上取决于您试图完成的任务,但我认为您可能需要考虑的一个选项是使用泛型,因此IProvider也是如此 interface IProvider { IList<IFile> GetFiles<T>() where T: IFile; } 接口IProvider { IList GetFiles(),其中T:IFile; } 可以这样实现

我认为ContentType枚举是多余的。 有没有办法用接口标识符之类的东西来代替枚举类型


非常感谢对界面设计的任何评论。

这实际上取决于您试图完成的任务,但我认为您可能需要考虑的一个选项是使用泛型,因此IProvider也是如此

interface IProvider
{
    IList<IFile> GetFiles<T>() where T: IFile;
}
接口IProvider
{
IList GetFiles(),其中T:IFile;
}
可以这样实现

public void ProviderConcrete()
{
    public IList<IFile> GetFiles<T>()
    {
        if(typeof(t) == typeof(IAudioFile))
            .... get Audio files

    }
}
public void Caller()
{
    var files = GetFiles<IAudioFile>();
} 
public void ProviderConcrete()
{
公共IList GetFiles()
{
if(typeof(t)=typeof(IAudioFile))
…获取音频文件
}
}
就这样叫着

public void ProviderConcrete()
{
    public IList<IFile> GetFiles<T>()
    {
        if(typeof(t) == typeof(IAudioFile))
            .... get Audio files

    }
}
public void Caller()
{
    var files = GetFiles<IAudioFile>();
} 
public void Caller()
{
var files=GetFiles();
} 

通常,最好是这样写:

void method(IFile file) {
    file.DoYourThing();
}

这是因为开关通常随着时间的推移成为维护的噩梦,而且也容易出错

我的建议是,当你需要代码>开关< /代码>或<>代码>如果其他的< /代码>链时,你应该考虑将方法插入到已经存在的类层次结构或创建一个新的层次结构。您应该努力编写与您在第一个代码段中看到的代码相似的代码


通常,这是通用的,因此可能不适用于您手头的特定问题。

我认为这里的要点是返回的列表包含“基本”对象

如果不喜欢,可以创建一些重载,如

IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();
IList GetAudioFiles();
IList GetVideoFiles();

什么让你认为你的枚举是多余的?@Abdul,仅仅因为接口类型映射到枚举值:IAudioFile=>ContentType.Audio;IVideoFile=>ContentType.VideoOk,很好!但是获取有关支持的文件类型的信息如何(请参见GetSupportedTypes)?嗯,在什么情况下需要调用GetSupportedTypes?客户端应该可以获取一组支持的类型,然后逐个仅获取支持的类型。您可以硬编码此方法以返回类型列表,但是有一天你可能会忘记更新它,然后轰隆一声。另一种选择是使用反射来迭代程序集中的所有类型,并选择那些在程序集中的所有类型上实现IFileiteration的类型,这是解决此类问题的最佳实践吗?对不起,我没有提到文件的类层次结构可能会在以后增长。所以,我需要更灵活的机制。