Определить тип вызывающего объекта в C # - PullRequest
14 голосов
/ 18 марта 2009

Независимо от того, является ли это хорошей идеей, возможно ли реализовать интерфейс, в котором исполняющая функция знает тип вызывающего объекта?

class A
{
   private C;

   public int doC(int input)
   {
      return C.DoSomething(input);
   }
}

class B
{
   private C;

   public int doC(int input)
   {
      return C.DoSomething(input);
   }
}

class C
{
   public int DoSomething(int input)
   {
      if(GetType(CallingObject) == A)
      {
         return input + 1;
      }
      else if(GetType(CallingObject) == B)
      {
         return input + 2;
      } 
      else
      {
         return input + 3;
      }
   }
}

Мне кажется, что это плохая практика кодирования (потому что параметры не меняются, а вывод будет), но кроме этого возможно ли это?

Я нахожусь в ситуации, когда я хочу, чтобы несколько определенных типов могли вызывать определенную функцию, но я не могу исключить доступ к этой функции. Я думал о наличии параметра "type"

DoSomething(int input, Type callingobject)

Но нет гарантии, что вызывающий объект будет использовать GetType (this), в отличие от GetType (B), чтобы подделать B независимо от их собственного типа.

Будет ли это так же просто (относительно просто), как изучение стека вызовов?


РЕДАКТИРОВАТЬ

Пожалуйста, проголосуйте за ответ ДжаредПара (если хотите), а также за Джона Феминеллу. Я не мог пометить оба ответа как принятые, и я принял ответ Джона Феминеллы, потому что это именно то, о чем я просил, а не ответ Джареда, который привел к решению, которое я ранее не рассматривал.

Ответы [ 11 ]

0 голосов
/ 18 марта 2009

(почти) всегда есть правильный дизайн, который может выполнить то, что вам нужно. Если вы сделаете один шаг назад, чтобы описать, что вам действительно нужно сделать, я уверен, что вы получите хотя бы один хороший дизайн, который не требует, чтобы вы прибегали к чему-то подобному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...