如何动态调用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 方法非常清楚地显示了正在发生的事情。反射隐藏了这一点,这对于以后维护代码来说通常比现在用反射使其非常紧凑的“酷”更烦人:)
是否可以使用输入变量作为方法的 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 方法非常清楚地显示了正在发生的事情。反射隐藏了这一点,这对于以后维护代码来说通常比现在用反射使其非常紧凑的“酷”更烦人:)