C# 处理未知类型而不强制转换
我一直在试图为一个用C#编写的小库中反复出现的问题找到一个优雅的解决方案 下面是问题的分类C# 处理未知类型而不强制转换,c#,generics,architecture,C#,Generics,Architecture,我一直在试图为一个用C#编写的小库中反复出现的问题找到一个优雅的解决方案 下面是问题的分类 // IMPLEMENTATION public class MyArgs : Args {} public class MyItem : Item { public override void Run(Args args) { // CAN I AVOID THIS CAST? var myArgs = args as MyArgs; } }
// IMPLEMENTATION
public class MyArgs : Args {}
public class MyItem : Item
{
public override void Run(Args args)
{
// CAN I AVOID THIS CAST?
var myArgs = args as MyArgs;
}
}
// LIBRARY
public class Args {}
public abstract class Item
{
public abstract void Run(Args args);
}
public class Manager
{
public List<Item> items;
public void RunAll (Args args)
{
foreach (Item item in items)
{
item.Run(args);
}
}
}
//实现
公共类MyArgs:Args{}
公共类MyItem:Item
{
公共覆盖无效运行(Args Args)
{
//我能避免这个角色吗?
var myArgs=args作为myArgs;
}
}
//图书馆
公共类Args{}
公共抽象类项
{
公开摘要无效运行(Args Args);
}
公共班级经理
{
公共清单项目;
公共void RunAll(Args Args)
{
foreach(项目中的项目)
{
项目运行(args);
}
}
}
因此,基本上,我希望能够通过manager将MyArgs发送到MyItem,而不让它知道。MyArgs是由用户定义的,所以我只知道它是基类
我尝试了一些泛型解决方案,例如,这将解决问题:
public abstract class Item<T>
{
public abstract void Run(T args);
}
公共抽象类项
{
公开摘要无效运行(T参数);
}
但我想避免让经理变得泛化
因此,我想我的问题是,我是否可以使用任何技巧来绕过这个问题,或者我只是想做一些不可能的事情。使
项
类通用并不会迫使您使管理器
类通用RunAll
方法无论如何都可以使用Args
类型。在这种情况下,为什么需要特定的MyArgs
?您希望如何选择一个特定的项目来处理特定的参数?为什么要强制转换?根据您在Run
中的操作,您可以直接安全地使用args
,而无需任何强制转换。实际上,泛型对您帮助不大,因为它们依赖于编译时*-类型推断。但是,您仅在**运行时提供实际类型。使项
类成为泛型并不强制您将管理器
类设置为泛型RunAll
方法无论如何都可以使用Args
类型。在这种情况下,为什么需要特定的MyArgs
?您希望如何选择一个特定的项目来处理特定的参数?为什么要强制转换?根据您在Run
中的操作,您可以直接安全地使用args
,而无需任何强制转换。实际上,泛型对您帮助不大,因为它们依赖于编译时*-类型推断。但是,您仅在**运行时提供实际类型。