所以我有一个带有隐式转换的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.
例外。
任何帮助将不胜感激。
答案 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>
,那么它将不起作用,但在这种情况下,你的代码应该被重构,因为你基本上忽略了你的通用参数。