如何动态调用Method的Class Name?

How to call Method's Class Name dynamically?

是否可以使用输入变量作为方法的 Class 名称?


我现在用的是:

Switch/Case 有多个 Namespace.Class.Method()

每个编解码器方法都有自己的 Class。

public static void SetControls(string codec_SelectedItem)
{
    switch (codec_SelectedItem)
    {
        case "Vorbis":
            Codec.Vorbis.Set();
            break;

        case "Opus":
            Codec.Opus.Set();
            break;

        case "AAC":
            Codec.AAC.Set();
            break;

        case "FLAC":
            Codec.FLAC.Set();
            break;

        case "PCM":
            Codec.PCM.Set();
            break;
    }
}

尝试简化:

单个 Method 带有动态 Class
使用 SelectedItem 作为方法的 Class 名称。

public static void SetControls(string codec_SelectedItem)
{
    Codec.[codec_SelectedItem].Set(); 
}

只需制作一个包含不同编解码器实例的字典,用所有编解码器一次性初始化字典。然后在需要时按名称获取任何编解码器。每个编解码器必须是一个单独的非静态 class 实现您创建的 ICodec 接口。

示例,未经验证的 c#,为您提供要点:

private static Dictionary<string, ICodec> _codec;

public static void Initialize()
{
    _codec = new Dictionary<string, ICodec> { 
        { "Vorbis", new VorbisCodec() }
        { "Opus", new OpusCodec() }
    };
}

public static void SetControls(string codecName)
{
    _codec[codecName].set();
}

public interface ICodec
{
    void set();
}

如您评论的那样添加以使其更加紧凑:

你也可以使用反射通过名字得到一个class,实例化它然后调用.set()方法:

((ICodec) Activator.CreateInstance(Assembly.GetExecutingAssembly().GetType(codecClassNameHere))).set();

虽然我反对它。代码也应该是可读的。 Dictionary 方法非常清楚地显示了正在发生的事情。反射隐藏了这一点,这对于以后维护代码来说通常比​​现在用反射使其非常紧凑的“酷”更烦人:)