Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理未知类型而不强制转换_C#_Generics_Architecture - Fatal编程技术网

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; } }

我一直在试图为一个用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;
    }
}


// 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
,而无需任何强制转换。实际上,泛型对您帮助不大,因为它们依赖于编译时*-类型推断。但是,您仅在**运行时提供实际类型。