C# 如何将MethodInfo.Invoke方法返回的值类型转换为正确的类型?
我想使用C# 如何将MethodInfo.Invoke方法返回的值类型转换为正确的类型?,c#,.net,reflection,methodinfo,C#,.net,Reflection,Methodinfo,我想使用MethodInfo.invoke方法调用一个返回struct的方法。但是,此metod的返回变量类型为对象,不能强制转换为结构 (发现,以及从struct切换到class的建议,这里:) 那么,我如何将被调用方法的(值)结果转换为它的正确类型呢 (我也尝试过简单的cast,但它抛出了一个InvalidCastException) 下面是我的一些代码块: 公共类MyInvokedClass { 公共结构MyStruct { ... }; public MyStruct InvokedMe
MethodInfo.invoke
方法调用一个返回struct
的方法。但是,此metod的返回变量类型为对象
,不能强制转换为结构
(发现,以及从struct
切换到class
的建议,这里:)
那么,我如何将被调用方法的(值)结果转换为它的正确类型呢
(我也尝试过简单的cast,但它抛出了一个InvalidCastException)
下面是我的一些代码块:
公共类MyInvokedClass
{
公共结构MyStruct
{ ... };
public MyStruct InvokedMethod()
{
结构;
...
回报结构;
}
}
公共类MyInvokingClass
{
//这里的结构相同
公共结构MyStruct
{ ... };
静态void Main(字符串[]参数)
{
...
MethodInfo MethodInfo=classType.GetMethod(methodName);
MyStruct result=(MyStruct)methodInfo.Invoke(classInstance,null);
//上面的行抛出一个InvalidCastException
}
}
谢谢大家! 强制转换失败,因为它们是不同的类型,更具体地说,一个是
MyInvokedClass.MyStruct
,另一个是MyInvokingClass.MyStruct
调用InvokedMethod
时,MyStruct
指嵌套在MyInvokedClass
中的类型,但执行强制转换时(MyStruct)指嵌套在MyInvokingClass
中的类型
您可以使用MyInvokedClass.MyStruct
内部MyInvokingClass
来引用正确的结构,但更好的是只使用一个MyStruct
类型
您可能会发现阅读更多关于声明空间的信息很有用:
您有两种不同的类型:
MyInvokedClass.MyStruct
和MyInvokingClass.MyStruct
您调用的方法可能会返回
MyInvokedClass.MyStruct
,并且您试图将其强制转换为MyInvokingClass.MyStruct
。您正在点击InvalidCastException,因为这是两种完全不同的类型。要解决您的问题,请将结构移出类:
public struct MyStruct
{ ... };
public class MyInvokedClass
{
public MyStruct InvokedMethod()
{
MyStruct structure;
...
return structure;
}
}
public class MyInvokingClass
{
static void Main(string[] args)
{
...
MethodInfo methodInfo = classType.GetMethod(methodName);
MyStruct result = (MyStruct)methodInfo.Invoke(classInstance, null);
}
}
请原谅我不完整地发布了我的代码:这两个类位于不同的名称空间、不同的项目中,这就是我两次声明结构的原因。我已经尝试将它移到类之外,但是有不同的名称空间。我已经尝试使用相同的名称空间,但是强制转换仍然不起作用…谢谢你的回复。。。在“C#basic concepts”中,有人写道“名称空间声明中具有相同完全限定名称空间名称的名称空间成员声明是单个组合声明空间的成员”,但是,尽管我有两个名称相同的名称空间(在不同的项目中)我仍然无法将一个命名空间的成员强制转换为另一个命名空间的相同声明成员。。。我想解决这个问题的最好方法是使用一个只有此类型声明的公共文件…你是对的,如果你有两个程序集,你可以将两个程序集将要使用的核心类型移动到第三个程序集,以便引用它并使用同一类型,从而使转换成功。事实上,这应该是可行的,如果我没有在不同的名称空间中声明类的话。请原谅我张贴的代码不完整。谢谢你的建议@洛安娜:名称空间与此无关。可以将MyInvokingClass放在命名空间A中,将MyInvokedClass放在命名空间B中,将MyStruct放在命名空间C中。是的,这都是关于不同的程序集,而不是命名空间。多亏了你的帖子,我现在读到了更多关于他们的文章(我以前应该读过)。非常感谢。