C # Использовать тип объекта для приведения (чтобы избежать использования регистра переключателя)? - PullRequest
0 голосов
/ 19 октября 2018

Я получил абстрактную комнату с несколькими дочерними классами.У некоторых из этих детей есть свойство MaximumCapacity.Когда что-то входит в комнату, я хочу, чтобы она проверила, есть ли у этой комнаты собственность, и если да, то что это такое.Я мог бы легко сделать это с помощью переключателя, но я бы не стал (много (повторяющегося) кода).

Только два важных свойства:

  • MaximumCapacity: максимумвместимость комнаты, хранящаяся в некоторых комнатах различного типа
  • CurrentPosition: комната, хранящаяся на объекте, который хочет войти в комнату.

Это то, что у меня сейчас есть:

// HOW :: Store type of Room in order for me to cast with it.
// My Attempt: 
Type T = CurrentPosition.GetType(); // Get the type of the Room

// The following doesn't work:
// Build-time exception: "T is used as a variable but is a type"
if ((CurrentPosition as T).GetProperty("Capacity") != null) 
{
    // Check capacity and enter Room.
}

Я пытался сделать if (int.Parse(CurrentPosition.GetType().GetProperty("MaximumCapacity")) > [number]) Но это дает Can't convert type PropertyInfo to Int.Это заставляет меня поверить, что я все еще должен привести Комнату к ее обочине (я думаю), чтобы проверить вместимость.

Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы можете сделать это без проверки типов.
Измените тип MaxCapacity на nullable и сделайте так, чтобы во всех комнатах было это свойство.
Тогда вы можете просто сделать комнату имеющей значение максимальной вместимости

if (room.MaxCapacity.HasValue)
{
    // do you logic
}

Вы можете сделать это более объектно-ориентированным способом, переместить логику в объект комнаты, чтобы решить, разрешено ли кому-то входить в комнату

if (room.AllowedFor(player))
{
    // do your logic
}

Тогда комнаты с MaxCapacity проверит это, комнатыкоторый не всегда будет возвращать false.

0 голосов
/ 19 октября 2018
public abstract class Room
{
    public abstract void BookTheRoom();
}
interface IMaximumCapacity
{
    int MaximumCapacity { get; set; }
}
public class StorageRoom : Room
{
    public override void BookTheRoom()
    {
        Console.WriteLine("Storage room booked to store the items.");
    }
}

public class TwinSharingRoom : Room,IMaximumCapacity
{
    public TwinSharingRoom(int capacity)
    {
        MaximumCapacity = capacity;
    }

    public int MaximumCapacity { get; set; }

    public override void BookTheRoom()
    {
        Console.WriteLine("Twinsharing room booked.");
    }
}

public class SingleSharingRoom : Room, IMaximumCapacity
{
    public SingleSharingRoom(int capacity)
    {
        MaximumCapacity = capacity;
    }

    public int MaximumCapacity { get; set; }

    public override void BookTheRoom()
    {
        Console.WriteLine("Single sharing room booked.");
    }
}

И вы можете использовать это как

class Program
{
    static void Main(string[] args)
    {
        var listOfRooms = new List<Room>() { new SingleSharingRoom(1), new StorageRoom(), new TwinSharingRoom(2) };

        foreach(var room in listOfRooms)
        {
            if(room is IMaximumCapacity)
            {
                room.BookTheRoom();
            }
        }
    }
}
0 голосов
/ 19 октября 2018

Звучит как работа для interface и Композиции .Таким образом, вы можете проверить, поддерживают ли ваши номера различные функции

Учитывая

public interface IMaximumCapacity
{
   int MaximumCapacity { get; set; }
}

public class BaseRoom
{

}

public class DerivedRoom : BaseRoom, IMaximumCapacity
{
   public int MaximumCapacity { get; set; }
}

Метод

public static bool GetMaximumCapacity(BaseRoom room, out int maximumCapacity)
{
   maximumCapacity = 0;

   if (room is IMaximumCapacity capcityRoom)
   {
      maximumCapacity = capcityRoom.MaximumCapacity;
      return true;
   }

   return false;
}

Использование

if(GetMaximumCapacity(someRoom,out var max)
{
    // yay, do something with max
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...