给出一个虚拟模拟的平板电脑来启动从类App继承的FooApp和BarApp之类的应用程序,那么告诉功能LaunchApp(...)启动哪个应用程序的好方法是什么?
我当前正在传递LaunchApp(System.Type appType),其中appType例如typeof(FooApp),然后在函数中进行验证。但是,这种模式似乎缺乏适当的类型安全性和通过自动完成舒适性。另一方面,我使用一个Enum然后通过例如转换为appType的替代模式。开关盒,似乎不符合D.R.Y.因为我需要保留另一个冗余的appType枚举列表。什么是这里的好模式?
答案 0 :(得分:1)
据我了解,您希望根据对象的类型调用不同的方法。但是不想引入一个新的枚举来帮助决定调用哪种方法。
为此,我建议您可以使用在较新的C#版本中使用的类型模式。它在哪里投射对象类型并为该特定类型运行开关盒。
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch
这是他们在文档中使用的示例。
private static void ShowCollectionInformation(object coll)
{
switch (coll)
{
case Array arr:
Console.WriteLine($"An array with {arr.Length} elements.");
break;
case IEnumerable<int> ieInt:
Console.WriteLine($"Average: {ieInt.Average(s => s)}");
break;
case IList list:
Console.WriteLine($"{list.Count} items");
break;
case IEnumerable ie:
string result = "";
foreach (var e in ie)
result += "${e} ";
Console.WriteLine(result);
break;
case null:
// Do nothing for a null.
break;
default:
Console.WriteLine($"A instance of type {coll.GetType().Name}");
break;
}
}