У меня вопрос про
на форуме нашёл только
этоАвтор: 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 ограничений — если возникает такая проблема при переходе от более обобщённых типов к более ограниченным.
Всего лишь хочу в зависимости от реального типа применять к переменной генерик-типа тот или иной алгоритм (в зависимости от того, оддерживает ли этот тип некоторые методы или не поддерживает) — но получается, что это нормальным путём невозможно