Вызовите метод универсального экземпляра класса, переданного как объект - PullRequest
2 голосов
/ 06 января 2012

У меня есть универсальный класс, содержащий специальную коллекцию. Экземпляр этой коллекции передается методу как объект. Теперь мне нужно вызвать один из методов универсального класса. Проблема, которую я вижу, заключается в том, что я не знаю, к какому типу относятся элементы в коллекции, поэтому я не могу разыграть их перед использованием свойства.

public class MyGenericCollection<T>: ReadOnlyObservableCollection<T>
{
  public bool MyProperty
  {
    get
    {
      // do some stuff and return
    }
  }
}

public bool ProblematicMethod(object argument)
{
  MyGenericCollection impossibleCast = (MyGenericCollection) argument;
  return impossibleCast.MyProperty;
}

Есть ли способ обойти эту проблему?

Ответы [ 2 ]

8 голосов
/ 06 января 2012

В этом случае, возможно, стоит добавить интерфейс, содержащий все ваши неуниверсальные элементы:

public IHasMyProperty
{
    bool MyProperty { get; }
}

затем заставьте коллекцию реализовать это:

public class MyGenericCollection<T>: ReadOnlyObservableCollection<T>,
    IHasMyProperty

затем возьмите IHasMyProperty в вашем методе:

public bool ProblematicMethod(IHasMyProperty argument)
{
    return argument.MyProperty;
}

или продолжайте принимать object, но приведите к интерфейсу:

public bool ProblematicMethod(object argument)
{
    return ((IHasMyProperty)argument).MyProperty;
}

В других случаях вы можете иметь неуниверсальный абстрактный базовый класс, который расширяет ваш универсальный класс, но в этом случае вы уже наследуете универсальный класс (ReadOnlyObservableCollection<T>), который удаляет эту опцию.

1 голос
/ 06 января 2012

Мне нравится интерфейс, предложенный Джоном, но вы также можете попробовать привести его по-другому:

public bool ProblematicMethod(object argument) 
{ 
  MyGenericCollection impossibleCast = argument as MyGenericCollection;
  if( impossibleCast != null )
    return impossibleCast.MyProperty; 

  // Other castings?
  return false;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...