Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

С# : Проверка реализации интерфейса

723
11 февраля 2006 года
Tommy
78 / / 13.10.2002
Здрасте.

Я с языке с# новичок, тут вот решил поупражняться: допустим я реализую класс число так:

 
Код:
public class CNumber<T> // : ...
{
   private T value;
   CNumber()
   {

   }
   // ...
}


Вот, этот класс реализует некие интерфесы, короче ладно, вопрос ввобще (в принципе )не относиться к предыдуущемы коду:
Как узнать реализует ли T, который будет подставлен, нужные мне интерфейсы естественно на этапе компиляции.
По-моему коммпилятор может это сделать? Или я ошибаюсь? Но если это нельзя сделать прямо, может есть какая обходная техника?
273
11 февраля 2006 года
3A3-968M
1.2K / / 22.12.2005
На самом деле очень просто это сделать. Есть два пути: через отражение (Reflection) и через обычное динамическое приведение. Делаем вторым способом: Допустим, есть некий интерфейс IInterface, который может быть реализован в T, тогда проверить на реализуемость можно так:
private T m_Value;
...
IInterface I=m_Value as IInterface;
Переменная I содержит null, если интерфейс IInterface не поддерживается, и ссылку, если интерфейс поддерживается. Такая проверка справедлива, если переменная m_Value инициализирована.
723
11 февраля 2006 года
Tommy
78 / / 13.10.2002
Извини, я ещё не полностью прочёл по нему доку, но вообещем
я сделал так (проверка реализации интерфейса на этапе компиляции) "на этапе компиляции" - ключевое в предыдущем посте, так вот

 
Код:
public class CNumber<T>
where T : MyInterface
{
    // ...
}


но это не самое главное, теперь вот пожалуй главная проблема:
Некоторые классы имеют в себе реализованные методы, (ни как не подтверждённые интерфейсом), в моём случае это операторы +, - , * , /. И вот, надо как-то сделать так чтобы , вставляя эти классы в CNumber, я мог вызывать их отдуда.
Это так просто не сделать так ка надо явно указывать интерфейс в списке предков класса, если класс мой то всё без проблем, а вот если это int, например.

Ну вот мои попытки:
Например я думал что можно было бы конечно заставить T реализовывать интерфейс IConvertable, пребразовать к типу соответсвующему и вызвать операцию для него, но если это тип CPoint, или тогда пришлось бы например для типа int выполнять операцию как для double.

Скорре всего надо всё это как-то хитро пропустить через какой-то обёрточный универсальный класс. Незнаю.
А может в C# это вообще как-то по другому решаеться. (У меня может просто привычки C++-овкие).
273
14 февраля 2006 года
3A3-968M
1.2K / / 22.12.2005
Тут дело придётся решать не интерфейсом. Поможет только Reflection. Тебе придётся взять Type о переданном типе и сравнить его с Type типа int или double, например. Выглядит примерно так:
public class SomeClass<T>
{
public SomeClass(T value)
{
Type t=typeof(T);
bool IsInt=t.Equals(typeof(int));
bool IsDouble=t.Equals(typeof(double));
...
}
}
Потом, когда определяется нужный тип, приводим значение value непосредственно к определённому типу и выполняем операции сложения.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог