Выполнить неявное приведение во время выполнения - PullRequest
7 голосов
/ 15 августа 2011

Итак, у меня есть класс Generic (в основном это контейнерный класс) с неявным приведением типа, например:

public class Container<T>  
{  
        public T Value { get; set; }

        public static implicit operator T(Container<T> t)
        {
            return t.Value;
        }

        public static implicit operator Container<T>(T t)
        {
            return new Container<T>() { Value = t };
        }
} 

Так что во время выполнения я хотел бы привести экземпляр Container<int> к int с использованием отражения, но, похоже, не могу найти способ, я попробовал метод "Cast", вызывающий, упомянутый в нескольких местах, но я получаю исключение Specified cast is not valid..

Любая помощь будет оценена.

Ответы [ 3 ]

5 голосов
/ 15 августа 2011

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

Но если бы до этого дошло, я бы лично предпочел намного более чистое решение dynamic (как упомянуто jbtule) отражению.

Но так как вы попросили решение с отражением (возможно, вы используете .NET 3.5 или более раннюю версию?), Вы можете сделать:

object obj = new Container<int>();

var type = obj.GetType();
var conversionMethod = type.GetMethod("op_Implicit", new[] { type });
int value = (int)conversionMethod.Invoke(null, new[] { obj });
1 голос
/ 15 августа 2011

Используя dlr, доступный из открытого источника ImpromptuInterface в nuget, вы можете динамически вызывать неявное или явное приведение .

int intInstance =Impromptu.InvokeConvert(containerInstance, typeof(int));

хотя этот пример довольно тривиален и может быть выполнен с помощью

int intInstance = (dynamic) containerInstnace;

также. но если вы не знаете, int во время компиляции, вы должны пойти на импровизацию.

0 голосов
/ 15 августа 2011

Запись неявных операторов позволяет вам делать приведения неявно .Другими словами, это совершенно законно:

int i = new Container<int>() { Value = 2 };
if (i == 2) 
{
    // This will be executed
}

Если у вас есть только Container<object>, это не сработает, но в этом случае ваш код, вероятно, все равно должен быть подвергнут рефакторингу, так как вы по сутиигнорируя общий параметр, который у вас есть.

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