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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать ссылку на тип 
:(
    Опции темы
nostromo
Дата 30.6.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Глупый вопрос, нужно тип превратить в объект, но что-то не соображу.
Есть несколько переменных типа int (поля объекта). Хочу ввести локальную переменную, которая являлась бы ссылкой на некоторое из этих полей, т.е. так чтобы изменяя эту переменную, изменялось бы и значение поля.

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


Java-ненавистник :)
****


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

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



Напрямую сделать не получится, но можно, извратившись написать что-то вроде:

Код
class MyClass1
{
    public int field1, field2, field3;
}

и дальше, чтобы присвоить значение 123 полю field1 объекта твоего класса

Код

FieldInfo field1 = typeof(MyClass1).GetField("field1");

MyClass1 obj = new MyClass1();
field1.SetValue(obj, 123);


Что-то ничего другого в голову не приходит.   

Это сообщение отредактировал(а) Дрон - 30.6.2006, 15:24


--------------------
Да. Именно так.
PM   Вверх
nostromo
Дата 30.6.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, в принципе годится.
Подозреваю, что выражения вида 
Код

FieldInfo field1 = typeof(MyClass1).GetField("field1");

выполняется медленно по сравнению с операцией получения ссылки в MC++.
Или я не прав?
В моем случае особая скорость не нужна, но все же интересно.
 
PM MAIL   Вверх
arilou
Дата 30.6.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(nostromo @  30.6.2006,  15:15 Найти цитируемый пост)
 Хочу ввести локальную переменную, которая являлась бы ссылкой на некоторое из этих полей, т.е. так чтобы изменяя эту переменную, изменялось бы и значение 

int - это value тип, поэтому ссылку на него сделать нельзя. наиболее примемлемый способ - описать событие, которое будет генериться при изменении св-ва, инкапсулирующего поле, и в обработчике синхронизроваться. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Дрон
Дата 30.6.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(nostromo @  30.6.2006,  16:32 Найти цитируемый пост)
выполняется медленно по сравнению с операцией получения ссылки в MC++.

Не знаю. Но обрати внимание, что получение FieldInfo достаточно сделать один раз -- оно ведь не привязано к конкретному объекту, а только к типу.
 


--------------------
Да. Именно так.
PM   Вверх
nostromo
Дата 30.6.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

int - это value тип, поэтому ссылку на него сделать нельзя.

Забавно, если бы поле не было value-типом, то проблем с работой с ним по ссылке не возникло бы. Учитывая, что выбор типа для поля определяется предметной областью, логично было бы ожидать более легкого превращения value-поля в object-поле. Ан нет... 

Еще вопрос, а если мне захочется получить ссылку на свойство, что тогда делать? 
PM MAIL   Вверх
arilou
Дата 30.6.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Погоди, ты поясни, в чем там у тебя дело. Что мешает вместо 
Цитата(nostromo @  30.6.2006,  15:15 Найти цитируемый пост)
локальную переменную

использовать
Цитата(nostromo @  30.6.2006,  15:15 Найти цитируемый пост)
поля объекта


? 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
nostromo
Дата 30.6.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Но обрати внимание, что получение FieldInfo достаточно сделать один раз -- оно ведь не привязано к конкретному объекту, а только к типу.

Согласен, однако в процессе парсинга файла, мне, исходя из контекста приходится определять, в какое поле писать. Тогда либо выносить FieldInfo field1 из локальных переменных метода в переменные класса, либо каждый раз делать инициализацию  в рантайме. Теоретически, помешать вычислить значение typeof(MyClass1).GetField("field1"); (аргумент --- константная строка) на этапе компиляции может лишь гипотетическая возможность изменения кода в процессе исполнения. Или я не прав?

Добавлено @ 16:08 
Цитата(arilou @ 30.6.2006,  15:54)
Погоди, ты поясни, в чем там у тебя дело. Что мешает вместо 
Цитата(nostromo @  30.6.2006,  15:15 Найти цитируемый пост)
локальную переменную

использовать
Цитата(nostromo @  30.6.2006,  15:15 Найти цитируемый пост)
поля объекта


?

Я делаю парсинг структурированного текстового файла (не XML) и заполняю поля соответствующих объектов, при этом, грубо говоря, я сначала читаю название поля, а затем его содержимое. Поэтому я не хочу писать отдельную функцию для каждого поля.
 
PM MAIL   Вверх
arilou
Дата 30.6.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(nostromo @  30.6.2006,  16:00 Найти цитируемый пост)
Согласен, однако в процессе парсинга файла, мне, исходя из контекста приходится определять, в какое поле писать. Тогда либо выносить FieldInfo field1 из локальных переменных метода в переменные класса, либо каждый раз делать инициализацию  в рантайме. Теоретически, помешать вычислить значение typeof(MyClass1).GetField("field1"); (аргумент --- константная строка) на этапе компиляции может лишь гипотетическая возможность изменения кода в процессе исполнения. Или я не прав?


задачка напоминает мне вот эту (моя старая статья):  http://www.gotdotnet.ru/LearnDotNet/NETFramework/81257.aspx

может пригодится. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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