So I have a Generic class (it's mostly a container class) with implicit casting, like this:
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 Cont开发者_如何学编程ainer<T>() { Value = t };
}
}
So in runtime I would like to cast an instance of Container<int>
to int using reflection but cannot seem to find a way, I've tried the "Cast" method invoking mentioned in a couple of places but I'm getting an Specified cast is not valid.
exception.
Any help will be appreciated.
There's almost never a good reason to do this unless the type in question is internal to an assembly that you cannot modify.
But if it came to that, I would personally prefer the much cleaner-looking dynamic
solution (as mentioned by jbtule) to reflection.
But since you asked for a solution with reflection (perhaps you are on .NET 3.5 or earlier?), you can do:
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 });
By using the dlr, accessible by the open source ImpromptuInterface in nuget, you can dynamically call an implicit or explicit cast.
int intInstance =Impromptu.InvokeConvert(containerInstance, typeof(int));
although this example is rather trival and can be accomplished via
int intInstance = (dynamic) containerInstnace;
as well. but if you don't know int
at compile time Impromptu is the way to go.
Writing implicit operators allow you to make the casts implicitly. In other words, this is perfectly legal:
int i = new Container<int>() { Value = 2 };
if (i == 2)
{
// This will be executed
}
If you only have a Container<object>
then that won't work, but in that case your code should probably be refactored anyway, since you're essentially ignoring the generic parameter you have.
精彩评论