C# 如何隐式转换反射的方法调用

C# 如何隐式转换反射的方法调用,c#,.net,reflection,casting,implicit-conversion,C#,.net,Reflection,Casting,Implicit Conversion,我有一个类东西,它可以从字符串隐式强制转换。当我使用Thing参数直接调用方法时,从字符串到Thing的转换是正确的 但是,如果我使用反射调用相同的方法,它会抛出异常 System.ArgumentException : Object of type 'System.String' cannot be converted to type 'Things.Program+Thing'. 也许有一个很好的理由,但我不明白。有人知道如何使用反射使其工作吗 namespace Things {

我有一个类
东西
,它可以从
字符串
隐式强制转换。当我使用
Thing
参数直接调用方法时,从
字符串
Thing
的转换是正确的

但是,如果我使用反射调用相同的方法,它会抛出异常

System.ArgumentException : Object of type 'System.String' cannot be 
converted to type 'Things.Program+Thing'.
也许有一个很好的理由,但我不明白。有人知道如何使用反射使其工作吗

namespace Things
{
    class Program
    {
        public class Thing
        {
            public string Some;

            public static implicit operator Thing(string s)
            {
                return new Thing {Some = s};
            }
        }

        public void showThing(Thing t)
        {
            Console.WriteLine("Some = " + t.Some);
        }

        public void Main()
        {
            showThing("foo");
            MethodInfo showThingReflected = GetType().GetMethod("showThing");
            showThingReflected.Invoke(this, new dynamic[] {"foo"});
        }
    }
}

梅塔:请不要讨论隐式强制转换或反射为什么不好。

在这种特定情况下,您可以通过数组类型进行转换,即

showThingReflected.Invoke(this, new Thing[] {"foo"});

但那是一种“欺骗”。一般来说,您不能期望调用Kue>代码>考虑用户定义的<代码>隐式运算符< /代码>。此转换必须在编译时推断。

找到了使用类型转换器的答案(如Saeed所述)
似乎能胜任这项工作


诀窍在于认识到编译器为隐式转换运算符创建了一个名为
op_Implicit
的特殊静态方法

object arg = "foo";

// Program.showThing(Thing t)
var showThingReflected = GetType().GetMethod("showThing");

// typeof(Thing)
var paramType = showThingReflected.GetParameters()
                                  .Single()
                                  .ParameterType; 

// Thing.implicit operator Thing(string s)
var converter = paramType.GetMethod("op_Implicit", new[] { arg.GetType() });

if (converter != null)
    arg = converter.Invoke(null, new[] { arg }); // Converter exists: arg = (Thing)"foo";

// showThing(arg)
showThingReflected.Invoke(this, new[] { arg });

毫无疑问,我敢打赌这是因为(我想,如果我错了,请纠正我),隐式强制转换是编译器的语法糖。对转换方法的实际调用在编译时连接起来。编辑:对于任何对象转换,您是否需要一些调用隐式转换器的通用方法?或者这是一种特殊情况,即您愿意针对一个单独的静态方法或某个预定方法的其他反射调用,或者一个专门的构造函数?类似的问题隐式转换不可能通过反射实现,但您可以使用。如果您真的想这样做,您可以构造一个表达式树来完成您需要的操作,然后将其编译成一个方法并执行它。如果你觉得这对你有用,我可以加上它作为答案。@ChrisSinclair:实际上我使用了一个第三方应用程序来执行反射的东西。但我想我可以把它包装起来。下面是另一个类似的答案: