【问题标题】:How to call Method's Class Name dynamically?如何动态调用方法的类名?
【发布时间】:2020-12-07 13:00:42
【问题描述】:

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


我现在使用的:

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

每个编解码器方法都在自己的类中。

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 作为方法的类名。

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

【问题讨论】:

  • 我怀疑这段代码是否可以编译
  • 编解码器名称字典和实现 .set() 的接口?
  • @WalterVehoeven 正确,第二个示例无法编译。如果可能的话,我正在尝试找到正确的方法。
  • “你可以使用反射” @OlivierRogier 为什么?这是完全没有必要的。只需应用一些 OOP。
  • 编解码器是否嵌套在“编解码器”中?那是什么结构,看起来它们是静态类?

标签: c# codec


【解决方案1】:

只需使用不同编解码器的实例制作字典,使用所有编解码器一次性初始化字典。然后在需要时按名称获取任何编解码器。每个编解码器必须是实现您创建的 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();
}

添加您评论的内容以使其更加紧凑:

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

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

我建议不要这样做。代码也应该是可读的。 Dictionary 方法非常清楚地显示了正在发生的事情。反射隐藏了这一点,这对于以后维护代码通常更烦人,而不是现在通过反射使其非常紧凑的“酷”:)

【讨论】:

  • 这可行,但我不知道它是否比 switch/case 更简化。
  • 通常,这种开关盒的东西放在工厂类中。 CodecFactory.Create(codecName) 然后返回一个 ICodec,你可以用它来做你的事。这样,案例的丑陋就隐藏在一个地方,你可以在其他任何地方使用干净的单行调用 ICodec
  • 我正在努力实现它,我会告诉你结果如何。
  • ICodec 是所有编解码器都必须实现的接口。所以 Codec.Vorbis 必须实现 ICodec。为此,Vorbis 的定义必须为“public class Vorbis : ICodec”。这将迫使 Vorbis 执行 ICodec 定义的“合同”。 (也许谷歌有关 C# 接口的更多信息)否则你在正确的轨道上。
  • 我建议将 ICodec 放在一个单独的文件中。在 setcontrols() 中,您可以创建一个变量“var selectedCodec = _codec[codec_SelectedItem]”,并在该方法的所有类似代码行中重用该变量。那个更漂亮
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多