Generic constraints (Compiler Error CS0309)
От: darklight  
Дата: 22.06.08 14:06
Оценка:
У меня вопрос про
на форуме нашёл только это
Автор: aam
Дата: 13.02.06

Но у меня несколько другой вопрос.
Можно ли перевеси ошибку "Compiler Error CS0309", о несоответсвии генергик-типа заданному ограничению, из ошибки времени компиляции в ошибку времени выполнения.
Т.е., допустим, я во время выполнения сам проверю реальный тип переменных на соответствие нужным ограничениям (оператор is) и в зависимости от реального типа вызову тот или иной метод с параметрами генерик-типов, удовлетворяющих генерик-ограничением этих методов.
Пример

using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
     public interface Imod
    {
        void mod();
    }

    public class MyClass
    {
        public void func<T>(T a)
        {
            if (a is Imod)
            { f1<T>(a); } //*
            else { f2<T>(a); }
        }

        private void f1<T>(T a) where T : Imod
        {
            a.mod();
        }

        private void f2<T>(T a)
        {
            
        }
    }
}


Строка, помеченная "*" вызывает ошибк времени компиляции

The type 'T' must be convertible to 'WindowsApplication1.Imod' in order to use it as parameter 'T'


Поиск в MSDN Compiler Error CS0309 не дал ответа что с этим делать


Соотвственно один из двух вариантов вопроса:
1. Можно ли как-то конверитровать неограниченный генерик тип в ограниченный для использования в методах требующих ограниченный генерик-тип? Как сделать его "must be convertible"?
2. Как вызывать методы объектов, имеющих, неограниченный генерик тип, зная во время выполнения, конкретный тип? Ни чего кроме варианат использования рефлексии и member.invoke() в голову не приходит — но это не эффективно с точки зрения скорости выполнения (нужна высокая скорость)!


Есл ничего нормальным путём из этого сделать нельзя, то тогда встаёт вопрос о реальной пользы использования generic типо и generic ограничений — если возникает такая проблема при переходе от более обобщённых типов к более ограниченным.

Всего лишь хочу в зависимости от реального типа применять к переменной генерик-типа тот или иной алгоритм (в зависимости от того, оддерживает ли этот тип некоторые методы или не поддерживает) — но получается, что это нормальным путём невозможно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.