在运行时执行隐式转换

时间:2011-08-15 13:24:37

标签: c# generics reflection

所以我有一个带有隐式转换的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 个答案:

答案 0 :(得分:5)

除非有问题的类型是您无法修改的程序集内部,否则几乎没有理由这样做。

但如果是这样的话,我个人更喜欢看起来更清晰的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 :(得分:1)

通过使用nuget中的开源ImpromptuInterface可访问的dlr,您可以动态call an implicit or explicit cast

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

虽然这个例子很简单,可以通过

完成
int intInstance = (dynamic) containerInstnace;

也是。但是如果你在编译时不知道int即兴即可。

答案 2 :(得分:0)

编写隐式运算符允许您隐式地进行强制转换 。换句话说,这是完全合法的:

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

如果你只有一个Container<object>,那么它将不起作用,但在这种情况下,你的代码应该被重构,因为你基本上忽略了你的通用参数。