Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unable to cast object of type... 
:(
    Опции темы
SLeN
Дата 20.2.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



К примеру имеется простейший врапер для string

Код

    public class SimpleWrapper
    {
        string _value;
        public SimpleWrapper(string arg)
        {
            _value = arg;
        }

        public static explicit operator String(SimpleWrapper arg)
        {
            return arg._value;
        }
    }


Соответственно проходит на ура:

Код

        [Test]
        public void ExplicitCast()
        {
            SimpleWrapper wrapper = new SimpleWrapper("some string");
            Assert.AreEqual("some string", (string)wrapper);
        }


Но после упаковки в Object 

Код

        [Test]
        public void ExplictCastFromObject()
        {
            SimpleWrapper wrapper = new SimpleWrapper("some string");
            object obj = wrapper;
            Assert.AreEqual("some string", (string)obj);
        }


Вываливает Exception:

System.InvalidCastException : Unable to cast object of type 'SimpleWrapperCast.SimpleWrapper' to type 'System.String'

Как можно реализовать такую функциональность??? 
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
kobra
Дата 20.2.2010, 21:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



aа так?
Код
 Assert.AreEqual("some string", (string)(SimpleWrapper)obj);

PM MAIL   Вверх
SLeN
Дата 21.2.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



kobra, в таком случае клиентский код должен знать что он работает с врапером, чего не хотелось бы.
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
nmn
Дата 21.2.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 593
Регистрация: 26.11.2005

Репутация: 1
Всего: 1



Цитата(SLeN @ 21.2.2010,  09:28)
kobra, в таком случае клиентский код должен знать что он работает с врапером, чего не хотелось бы.

попробуй заменить на implicit,
хотя это вряд ли поможет, в c# строгая типизация, тип содержащийся в object должнен соответствовать приводимому типу или быть его наследником

Это сообщение отредактировал(а) nmn - 21.2.2010, 17:11
PM Skype   Вверх
SLeN
Дата 21.2.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



nmn, implicit к сожалению не поможет, честно говоря я вобще ни вижу ни одного способа приведения из object, кроме как использовать прокси класс (на подобии NHibernate'овского), но тот же стринг - закрытый класс и такая штука не пройдет.

По тому и создал тему на форуме надеясь на русский авось  smile 
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
kobra
Дата 22.2.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



а как на счет рефлексии?
PM MAIL   Вверх
KelTron
Дата 22.2.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Если нужен именно string, то можно просто переопределить ToString для твоего враппера.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
SLeN
Дата 24.2.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



kobra, не уловил сути идеи


KelTron, нет в данном случае это не поможет, после упаковки в object вывалится тоже исключение

p.s.:

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

Это сообщение отредактировал(а) SLeN - 24.2.2010, 19:57
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
KelTron
Дата 24.2.2010, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Я имел в виду:
Код

public class SimpleWrapper
{
    string _value;
    public SimpleWrapper(string arg)
    {
        _value = arg;
    }

    public override string ToString()
    {
        return _value;
    }
}

SimpleWrapper wrapper = new SimpleWrapper("some string");
object obj = wrapper;
Assert.AreEqual("some string", obj.ToString());

Но это только для строк...



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
SLeN
Дата 24.2.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



Именно этот вариант я и отметил в постскриптуме.
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
KelTron
Дата 24.2.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(SLeN @  24.2.2010,  20:07 Найти цитируемый пост)
Именно этот вариант я и отметил в постскриптуме.

Ну когда я писал его ещё не было..)

Цитата(SLeN @  24.2.2010,  19:46 Найти цитируемый пост)
клиентский код должен знать что работает с враппером

Почему? Там нигде нет приведения к SimpleWrapper.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
SLeN
Дата 24.2.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



По тому что от потребителя будет требоваться явно вызвать ToString()
К примеру если потребитель - NHibernate, он ToString() вызывать не будет, просто попытается привести к String.
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
KelTron
Дата 24.2.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Единственный вариант реализации который я вижу:
Код

class A 
{
    public static explicit operator SomeType(A a)
    {
        return a.ConvertToSomeType();
    }

    protected virtual SomeType ConvertToSomeType()
    {
        return ...
    }
}

class B : A
{
    public static explicit operator SomeType(B b)
    {
        return b.ConvertToSomeType();
    }

    protected override SomeType ConvertToSomeType()
    {
        return ...
    }
}


A a1 = new A();
(SomeType)a1 // A.operator SomeType
A a2 = new B();
(SomeType)a2; // B.operator SomeType

Но это прокатило бы если бы ты мог изменить класс object, т.к. это невозможно, значит и такое поведение не реализовать...


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
mrbrooks
Дата 25.2.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



Цитата(SLeN @  21.2.2010,  19:51 Найти цитируемый пост)
но тот же стринг - закрытый класс и такая штука не пройдет.

если использовать расширения - это уже не проблема.
PM MAIL   Вверх
SLeN
Дата 25.2.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 8.12.2006
Где: SPB

Репутация: 2
Всего: 4



mrbrooks, к сожалению расширения так же не решают поставленной задачи, клиентский код должен будет делать явные вызовы.

Я полагаю что задача не решаема.
--------------------
Православные не проходите мимо! Люди нуждаются в вас
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.