Проблема преобразования типов в .NET: просто, но сложно - PullRequest
2 голосов
/ 30 марта 2010

Ну

вопрос довольно прост.

У меня есть объект, определенный как:

public class FullListObject : System.Collections.ArrayList, IPagedCollection

И когда я пытаюсь:

IPagedCollection pagedCollection = (IPagedCollection)value;

Это не работает ... значение - это FullListObject ... это мой новый код, пытающийся обойти проблему с помощью оператора "is". Когда система проверяет (value is IPagedCollection), она никогда не выполняется для FullListObject.

Как привести объект к другому объекту с типом интерфейса?

EDIT:

Только для записи: код ошибки

if (value is IPagedCollection)
{
    IPagedCollection pagedCollection = value as IPagedCollection;

If никогда не задавало значение true, и принудительное преобразование тоже не работало. Таким образом, проблема заключалась в двойном определении классов. Теперь я определил FullObjectList в проекте «Commom» для классов, используемых всей системой. Проблема исчезла!

Ответы [ 3 ]

6 голосов
/ 30 марта 2010

Вы делаете это правильно. Попробуйте это (это также не удастся, но покажет проблему):

IPagedCollection pagedCollection = (FullListObject)value;

Компилятор должен хорошо это принять. Если нет, у вас есть несколько определений IPagedCollection и / или FullListObject, которые конфликтуют друг с другом. Если это не удается во время выполнения, ваше значение не равно FullListObject.

0 голосов
/ 30 марта 2010

В FullListObject явно реализовано IPagedCollection? Если это так, то в соответствии с Msdn

Класс, который реализует интерфейс, может явно реализовать член этого интерфейса. Когда член явно реализован, к нему нельзя получить доступ через экземпляр класса, а только через экземпляр интерфейса.

Чтобы определить явную реализацию, проверьте реализации элементов интерфейса. Например,

public interface IService
{
    void Start ();
    void Stop ();
}

public class Service : IService
{
    #region IService Members

    // note interface-dot-membername signature. explicit
    // implementations *explicitly* declare the interface
    // they are members of. this allows an implementation
    // to contain members of the same name but of different
    // interface declarations
    void IService.Start () { }
    void IService.Stop () { }

    #endregion
}

Если это действительно так, то у вас есть один из двух вариантов,

  1. Измените FullListObject для имплицитной реализации IPagedCollection или
  2. Примените FullListObject к экземпляру IPagedCollection, как вы сделали
0 голосов
/ 30 марта 2010

Ваш код должен работать нормально - возможно, я не понимаю, чего вы пытаетесь достичь.

Вам не нужно разыгрывать value в этом задании. Просто делаю

    IPagedCollection pagedCollection = value;

будет достаточно - pagedCollection будет объявлено как IPagedCollection и содержит FullListObject. Проверки с использованием оператора is должны возвращать true. Делая обратное, как предложил Лусеро, скажет, есть ли у вас FullListObject, как вы ожидаете. Не могли бы вы показать нам свой код с проверками, чтобы мы могли видеть, какова ваша цель?

...