Execute implicit cast at runtime

社会主义新天地 提交于 2021-02-08 13:35:40

问题


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 Container<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.


回答1:


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 });



回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/7065453/execute-implicit-cast-at-runtime

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!