gpt4 book ai didi

c# - 如何隐式转换反射方法调用

转载 作者:IT王子 更新时间:2023-10-29 04:27:52 27 4
gpt4 key购买 nike

我有一个 Thing 类,它可以从 string 隐式转换。当我直接调用带有 Thing 参数的方法时,从 stringThing 的转换正确完成。

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

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

元:拜托,不要讨论为什么隐式转换或反射不好。

最佳答案

诀窍是要意识到编译器会为您的隐式转换运算符创建一个名为 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 });

关于c# - 如何隐式转换反射方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544056/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com