根据某些条件c#返回不同类型的方法

时间:2016-05-11 17:39:10

标签: c# .net

一切!我现在面临以下问题。考虑一个方法应该创建新的列表,例如,如果有一些空闲空间,则为 $searched = get_search_query(); $custom_fields = get_post_custom(); foreach($custom_fields as $field_key => $field_values) { foreach($field_values as $key => $value) { if (stripos($value, $searched) !== false) { $in = $value; $search = $searched; $replace = '<strong>' . $searched . '</strong>'; $out = str_ireplace($search, $replace, $in); echo '<p>' . $out . '</p>'; } } } 类型的对象,否则返回类型为Room的列表对象,因此伪代码如下:

RoomConflict

如何创建这样的方法?我是否需要使用public [some type] CreateRooms(){ if(there is some space){ return new List<Room>(){new Room(), new Room()}; } else{ return new List<RoomConflict>(){new RoomConflict(), new RoomConflict()} }} 类型的dynamic。或者也许object并将null传递给未使用的param。什么解决方案更好?

5 个答案:

答案 0 :(得分:1)

如果调用该方法的代码知道将返回什么类,您可以考虑使用泛型。如果没有,您可以使用普通Object或创建一个包装类,它可以包含两种类型,其中一种类型为null

但我认为正确的解决方案是在代码中调用方法,检查方法中的条件,调用返回RoomConfict的方法或返回{ {1}}。

答案 1 :(得分:1)

RoomRoomConflict都实现了一些通用接口吗?换句话说,调用者可以将结果转换为IRoom并使用返回的对象而不知道它是Room还是RoomConflict?如果答案是否定的,那么答案就是不要尝试做你正在做的事情。

当有人调用方法时,他们不需要检查结果以查看它是什么类型。例如,您不希望有人调用该方法,获取结果,然后检查返回的对象是Room还是RoomConflict。强类型编程的要点是你不需要这样做。

如果不了解如何使用这些类,我建议只返回可用房间列表(如果有),并且如果没有可用房间,则返回空列表。这样,该方法总是返回List<Room>,如果没有,那么列表就是空的。

如果RoomConflict是完全不同的对象,则可能与RoomConflict处理的任何功能都应该在不同的方法或不同的类中。要学习的最佳实践之一是让每个班级保持一个单一的责任,而不是试图让一个班级或一个方法做不相关的事情。

答案 2 :(得分:0)

根据给定的上下文,我建议在发生冲突时返回null而不是创建RoomConflict类..

然后你可以进行null检查然后处理需要处理的内容

编辑:只是为了使用null检查来证明斯科特的答案

    void BuildHouse()
    {
        List<Room> rooms = CreateRooms();
        foreach (Room room in rooms)
        {
            if(room != null)
            {
                //paint room
            }
            else
            {
                //expand lot
            }
        }
    }

答案 3 :(得分:0)

您在dynamic类型object之间的选择取决于此方法的调用者。

dynamic将在运行时绑定类型,而object将执行编译时检查并将返回类型装箱到对象类型(附加操作)。在这两种情况下,调用者都必须评估返回类型以转换返回类型。

答案 4 :(得分:0)

我通常处理这种情况的方式是创建一个包含成功的响应类型,一个成功的值,以及一个不成功的原因。所以对于你的情况,它看起来像这样:

public class RoomRequestResult
{
    public bool Success { get; set; }
    public Room ResultValue { get; set }
    public RoomConflict FailureReason { get; set; }
}

那么你的返回类型将是IEnumerable<RoomRequestResult>,结果集合的每个元素都是自我描述的。