Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/43: Рейтинг темы: голосов - 43, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
1

Приведение типов

03.05.2011, 18:37. Показов 8093. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть 2 класса, экземпляр одного из них передаётся в другой по ссылке:
C#
1
2
3
4
5
        
public B(Object a)
{
      _a = a;
}
далее мне нужно вызвать определенный метод из объекта a:
C#
1
_a.SomeMethod();
Как привести объект а к определенному типу, чтобы шарп дал возможность вызвать метод? Я получаю тип, но привести не получается:
C#
1
Type t =.GetType();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2011, 18:37
Ответы с готовыми решениями:

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, "Полный справочник по C#"), и нашел такое (ст. 77) Поскольку при...

Приведение типов
Доброго времени суток! Прошу помощи с решением данного задания. Я пытался решить, но возникли...

приведение типов
загоняю из файла фио в хеш таблицу как ключ из второго файла страну и минуты разговора в Arraylist...

Приведение типов
Вопрос сугубо теоретический, если тут такое разрешено. Знания почерпнуты из книги Троелсен Э. -...

20
289 / 234 / 33
Регистрация: 09.02.2011
Сообщений: 435
03.05.2011, 18:46 2
C#
1
(int)_a
так ты приведешь к типу int
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 18:48  [ТС] 3
(int)_a
Проблема в том, что я не знаю объект какого класса придёт, то есть нужно узнать тип, а потом привести
0
289 / 234 / 33
Регистрация: 09.02.2011
Сообщений: 435
03.05.2011, 18:53 4
typeof вот пример с msdn
C#
1
2
3
4
5
6
7
var x : double = Math.PI;
var y : String = "Hello";
var z : int[] = new int[10];
 
print("The type of x (a double) is " + typeof(x)  );
print("The type of y (a String) is " + typeof(y) );
print("The type of z (an int[]) is " + typeof(z) );
Пример не шарповский, но функция должна подойти
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 18:57  [ТС] 5
Ладно еще раз, тип я получил:
C#
1
2
3
Type t =.GetType();
//t.FullName выведет, полное название класса "SomeClass" какой-нибудь, как привести к нему теперь?
(t.FullName)_a //не работает!!!!
0
289 / 234 / 33
Регистрация: 09.02.2011
Сообщений: 435
03.05.2011, 19:00 6
если не ошибаюсь то так
C#
1
((t)_a).FullName
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 19:02  [ТС] 7
Цитата Сообщение от dzjundzja88 Посмотреть сообщение
если не ошибаюсь то так
C#
1
((t)_a).FullName
Что этот код должен сделать?
0
289 / 234 / 33
Регистрация: 09.02.2011
Сообщений: 435
03.05.2011, 19:04 8
объект _а приведется к типу t и вызовется метод FullName, который должен вывести полное имя

Я прогнал, задачу не понял
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 19:06  [ТС] 9
Я могу получить полное имя, просто вызвав t.FullName,
а вот приведение (t)_a не работает
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
03.05.2011, 20:26 10
смотрим в код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
 
namespace SomeNamespace {
    class A {
        public void Printing() {
            Console.WriteLine("Экземплярный метод объекта класса А");
        }
        public static void PrintingStat() {
            Console.WriteLine("Статический метод класса А");
        }
    }
    class B {
        public void Printing() {
            Console.WriteLine("Экземплярный метод объекта класса B");
        }
        public static void PrintingStat() {
            Console.WriteLine("Статический метод класса B");
        }
    }
    class ClassExplorer { 
        public void SomeMethod(Object arg) {
            Type t = arg.GetType();
            var tObj = Activator.CreateInstance(t);         //создание объекта по извлеченному из аргумента функции типу
            Console.WriteLine(tObj.GetType().ToString());   //вот это объект класса А, но использовать корректно мы не можем
            try {
                t.GetMethod("Printing").Invoke(arg, null);  //вот так вызывается экземплярный метод
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }
            try {
                t.GetMethod("PrintingStat").Invoke(null, null);
            } catch (Exception) {
            }
        }
    }
    class Program {
        static void Main() {
            (new ClassExplorer()).SomeMethod(new A());
            (new ClassExplorer()).SomeMethod(new B());
            Console.ReadLine();
        }
    }
}
привести динамически тип можно, но достучаться к его методам и полям мне не удалось, но удалось вызвать нужные методы - и статический и экземплярный.
если вам нужно использовать рефлексию, а это и есть рефлексия, то могу посоветовать вам статью на эту тему
2
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 20:30  [ТС] 11
Делегаты тут не помогут?
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,936
03.05.2011, 20:43 12
Делегаты тут не помогут?
Вы знаете что такое делегаты?
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 21:20  [ТС] 13
Фигню сказал, сорри.

Вообщем я всё-таки накопал, как можно решить мою проблему: создал интерфейс и вызвал метод так:
C#
1
2
SomeInterterface I = _a as SomeInterterface;
_a.A_1()
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
03.05.2011, 22:29 14
а откуда вы взяли интерфейс?
аналогичным способом можно было привести к известному классу и не мучиться
приведите свой код пожалуйста. мне интересно
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
03.05.2011, 22:38  [ТС] 15
Цитата Сообщение от Koran Посмотреть сообщение
аналогичным способом можно было привести к известному классу и не мучиться
Не получится, какого-то общего класса нет.
Получилось так: классы наследуют определенный интерфейс и потом приводятся к этому интерфейсу, я просто не знал, что так можно делать, думал что нужно привести к определенному типу.

Цитата Сообщение от Koran Посмотреть сообщение
приведите свой код пожалуйста. мне интересно
Не стоит, да и не на работе я уже.

С динамических языков тяжело перейти обратно )
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
03.05.2011, 23:11 16
с приведением объектов к типу интерфейсов следует быть осторожным ибо когда приводится к типу интерфейса, который реализует класс, объект которого мы приводим к типу интерфейса, то этот объект будет реализировать только реализацию методов интерфейса, которые были переопределены в классе-наследнике.
например вот такой код:
C#
1
2
3
            System.IO.FileStream fs = new System.IO.FileStream(@"some.txt", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);
            IDisposable IDObject = fs as IDisposable;
            IDObject.Dispose();
в объекте IDObject будет реализация только метода Dispose() интерфейса IDisposable, который был переопределён в классе FileStream. если вам этого достаточно, то можно делать и так, но другие методы и поля не будут доступны.
0
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 3
12.05.2011, 18:48 17
Ребята у меня похожая проблема:
допустим есть форма
C#
1
2
3
4
class fStart : Form
{
public string str = "строка";
}
у нас есть обєкт єтого класса this
и мы можем свободно обращатся и изменять переменную str
C#
1
this.str = "проблем нету";
но есле зделать так:
C#
1
object obj = this;
у vb.net можно было обращатся obj.str
в С# увы такого зделать нельзя
, ну и соответственно визвать метод есле таков есть (что как я понял хочет автор теми)
Так вот у меня есть тoлько переменная obj типа object где находится целая форма импортированная с DLL
вызвать ее получается
C#
1
2
Form frm = (Form)obj;
frm.Show();
Как работать с переменными, и методами obj?
0
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 9
12.05.2011, 18:55  [ТС] 18
Зачем ты приводишь форму к типу object?

Чтобы получить доступ к публичному методу, тебе нужно: либо привести объект к нужному типу(классу), либо к определенному интерфейсу (так поступил я)
0
0 / 0 / 0
Регистрация: 12.05.2011
Сообщений: 3
13.05.2011, 12:20 19
Перед компиляцией нам неизвесный нужний тип или определенный интерфейс, в процессе выполнения кода у меня получается вытащить в виде стрингового параметра в какой тип нужно привести.
Но что с ним дальше делать незнаю.
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
13.05.2011, 12:51 20
nickROMAnt, если у вас в процесса написания фактически неизвестно какой тип будет или какой интерфейс, но вы знаете его структуру (названия методов, имена полей и так далее), но нет самого класса, чтобы можно было нормально привести к нему, тогда используйте методы рефлексии
0
13.05.2011, 12:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2011, 12:51
Помогаю со студенческими работами здесь

Приведение типов
Здравствуйте. Как привести тип ArraуList к типу RibbonDropDownItem? Просто пишу надстройку для...

Приведение типов
Здравствуйте. Есть задание:Даны два массива X и Y одинакового размера. Найти i, при котором...

Приведение типов
Здравствуйте. Класс ContractEmployee - производный от Employee. Пример1. Employee e = new...

Приведение типов
Здравствуйте, нужно написать функцию, которая принимает 2 параметре: указатель на произвольный тип...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru