C#模式来传递相当于子类的内容?

C#模式来传递相当于子类的内容?,c#,unity3d,design-patterns,C#,Unity3d,Design Patterns,如果有一个虚拟的模拟平板电脑,它可以启动像FooApp和BarApp这样的应用程序,这些应用程序继承自类应用程序,那么告诉函数LaunchApp(…)要启动哪个应用程序的好方法是什么呢 我目前正在传递LaunchApp(System.Type appType),其中appType是例如typeof(FooApp),然后在函数中进行验证。然而,这种模式似乎缺乏适当的类型安全性和通过自动完成舒适性。另一方面,另一种模式是,我使用一个枚举,然后通过例如开关盒转换为appType,这似乎不符合D.R.Y

如果有一个虚拟的模拟平板电脑,它可以启动像FooApp和BarApp这样的应用程序,这些应用程序继承自类应用程序,那么告诉函数LaunchApp(…)要启动哪个应用程序的好方法是什么呢


我目前正在传递LaunchApp(System.Type appType),其中appType是例如typeof(FooApp),然后在函数中进行验证。然而,这种模式似乎缺乏适当的类型安全性和通过自动完成舒适性。另一方面,另一种模式是,我使用一个枚举,然后通过例如开关盒转换为appType,这似乎不符合D.R.Y.的要求,因为我需要保留另一个冗余appType枚举列表。这里的好模式是什么?

据我所知,您希望根据对象的类型调用不同的方法。但是我不想引入一个新的枚举来帮助决定调用哪个方法

为此,我建议您可以在较新的C#版本中使用类型模式。它在其中强制转换对象类型并为该特定类型运行切换案例

以下是他们在文档中使用的示例

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;   
        }
    }
私有静态void ShowCollectionInformation(对象coll)
{
开关(coll)
{
案例阵列arr:
WriteLine($“一个具有{arr.Length}元素的数组。”);
打破
案例IEnumerable ieInt:
WriteLine($“Average:{ieInt.Average(s=>s)}”);
打破
案例列表:
Console.WriteLine($“{list.Count}项”);
打破
案例IEnumerable ie:
字符串结果=”;
foreach(ie中的变量e)
结果+=“${e}”;
控制台写入线(结果);
打破
大小写为空:
//不为空值执行任何操作。
打破
违约:
WriteLine($“类型为{coll.GetType().Name}的实例”);
打破
}
}

启动App(),其中T:App
?由于不知道启动应用程序需要做什么,很难给出更多的想法。如果你能提供具体的示例代码,那真的会很有帮助。基本上LaunchApp(x)总是这样做——它关闭一个现有的应用程序,然后通过AddComponent(x)将特定的FooApp(通常被认为是应用程序的子类)添加到一个新的Unity游戏对象中。唯一的区别是特定的app子类,我目前可以不可知地只在一行代码中传递它,这很好(并且比任何长切换情况都好):void OpenApp(System.Type appType){currentApp=(app)appObject.AddComponent(appType);}请将其编辑到问题中。(听起来使用泛型方法可能很好,但我不完全确定…)谢谢。我相信这可能更像是调用一个特定的、始终相同的方法,该方法只是将子类添加为组件。也许我的用例太晦涩了…好吧,它也可以解决这个问题。虽然您当然需要为每种类型创建一个案例,但这并不像您所寻求的那样通用。或者,您可以使用GetType以某种方式获取它,或者使用一个方法或类似的方法。我个人可能会进行开关转换,然后制作一个管理器方法来接收所需的参数和相关的游戏对象。这意味着只在一个地方添加类型。但是让我们看看其他人是否有更通用的解决方案。TypeOf应适用于此目的。如果我正确理解您希望执行的操作,您可以将传递到方法中的类型锁定为接口或类的子类型。public void YourMethod(T),其中T:IYourType{//Do stuff}