我目前正在了解来自this video的Reflection
晚期绑定。
当我复制视频中的代码时,有一部分让我感到困惑。它是在使用Invoke
方法的时候:
MethodInfo getFullNameMethod = customerType.GetMethod("GetFullName");
string[] parameters = new string[2];
parameters[0] = "First";
parameters[1] = "Last";
//here is where I got confused...
string fullName = (string)getFullNameMethod.Invoke(customerInstance, parameters);
据我所知(视频中也显示)Invoke
的输入参数为(object, object[])
,并且没有带输入参数(object, object)
的重载方法。
这里传递的内容是(object, string[])
。所以,起初我预计会出现编译错误,因为我认为string[]
是object
而不是object[]
。但是......没有编译错误。
这让我很困惑:为什么string[]
是object[]
而不是object
(每个Type
C#毕竟是从object
派生的?我们不能像这样string[]
分配object
吗?
object obj = new string[3]; //this is OK
string[]
object
和object[]
如何?使用其他数据类型(比如int
)作为类比,我绝不会期望变量同时为int
和int[]
。
有人可以启发我吗?
Here is my full code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Type customerType = executingAssembly.GetType("ConsoleApplication2.Customer");
object customerInstance = Activator.CreateInstance(customerType);
MethodInfo getFullNameMethod = customerType.GetMethod("GetFullName");
string[] parameters = new string[2];
parameters[0] = "First";
parameters[1] = "Last";
string fullName = (string)getFullNameMethod.Invoke(customerInstance, parameters);
Console.WriteLine(fullName);
Console.ReadKey();
}
}
class Customer {
public string GetFullName(string FirstName, string LastName) {
return FirstName + " " + LastName;
}
}
}
答案 0 :(得分:1)
根据MSDN
对于任何两个引用类型A和B,如果是隐式引用 转换(第6.1.4节)或显式参考转换(第 6.2.3)从A到B存在,那么从数组类型A [R]到数组类型B [R]也存在相同的引用转换,其中R是任意的 给定rank-specifier(但两种数组类型相同)。 此 关系称为数组协方差。
以下代码完全有效。
string[] items = new string[] {"A", "B", "C"};
object[] objItems = items;
这就是为什么在您的情况下,传递string[]
有效并将转换为object[]