C # динамическое приведение универсального объекта во время выполнения - PullRequest
1 голос
/ 06 марта 2011

Редактировать: изменен неправильный термин бокс на кастинг.

У меня следующая проблема:

Если я создаю новый делегат типа Action или Func, он будет приведен к типу делегата.

var @delegate = Delegate.CreateDelegate(type, @object, methodInfo);

Но для универсального класса мне нужен правильно приведенный объект.

Рассмотрим следующий пример:

class Example<T> {
    Type GenericType() {
        return typeof(T);
    }
}

static Example<T> Create<T>(T @delegate) {
    return new Example<T>();
}

Example.Create(@delegate).GenericType();

Это вернет Delegate как тип, поскольку это был тип приведенного объекта (@delegate).

Одним из решений может быть приведение к делегату следующим образом:

if(@delegate is Action)
    Example.Create((Action)@delegate).GenericType();

Но поскольку Delegate.CreateDelegate также может создавать делегаты Action или Func, проверить все варианты невозможно.

Я не могу изменить общий класс, поэтому я должен привести делегата.

Я надеюсь, что смог объяснить мою проблему. Я не являюсь носителем английского языка ...

Редактировать: Проблема в том, что typeof (T) не возвращает «реальный» тип объекта. Но я боюсь, что нет решения.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2011

Если вы можете использовать .net 4.0, то ваше выше работает, если вы приведете к динамическому

 Example.Create((dynamic)@delegate).GenericType();

Если вы не можете, тогда вам просто нужно немного подумать и абстрагироваться.

   abstract class Example{
        abstract Type GenericType();
   }  

   class Example<T>:Example {
       override Type GenericType() {
           return typeof(T);
       }
   }

   static Example Create(Delegate @delegate) {
         return (Example)Activator.CreateInstance(typeof(Example<>).MakeGenericType(new []{@delegate.GetType()}));
    }
0 голосов
/ 01 августа 2011

Чтобы ответить на мой собственный вопрос: это невозможно. (

0 голосов
/ 06 марта 2011

Что не так с @delegate.GetType() для получения фактического типа делегата?

Кроме того, примечание: вы неправильно используете термин "бокс".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...