C#Reflection:在特定类型的对象列表中键入强制转换方法返回值

时间:2018-04-06 06:16:15

标签: c# system.reflection

我有以下汇编,其中包含以下数据

demo.dll

第1课

namespace demo

public class Data
{
    public string FirstName {get; set;}
}

第2课

namespace demo

public class Utility
{
   private List<Data> items;

   public Utility()
   {
      items = new List<Data>();
      items.add(new Data(){ FirstName = "Abc" });
   }

   public List<Data> GetItems()
   {
       return items;
   }
}

现在我想使用运行时加载demo.dll汇编并调用GetItem()方法。

为此,我可以编写以下代码

Assembly assembly = Assembly.LoadFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ,"demo.dll"));

Type Utility= assembly.GetType("demo.Utility");
Type Data= assembly.GetType("demo.Data");

MethodInfo GetItems = Utility.GetMethod("GetItems");

object utility = Activator.CreateInstance(Utility);

object returnValue = GetItems.Invoke(utility, null);

现在,我想在类型数据列表中的returnValue上方输入,并访问FirstName属性。

我如何使用反射实现这一目标?

1 个答案:

答案 0 :(得分:3)

假设你写的所有内容都适用

object returnValue = GetItems.Invoke(utility, null);

returnValue实际上是List<Data>,但您无法投射它,因为在编译时编译器没有Data类的类型信息。但是,由于List<T>实现了IList,你可以强制转换它并迭代它的项目(IEnumerable<object>也应该工作)。

然后您可以再次使用反射来访问FirstName属性:

var returnValue = (IList)GetItems.Invoke(utility, null);

foreach (var item in returnValue)
{
    var type = item.GetType();
    var property = type.GetProperty("FirstName");
    var firstName = property.GetValue(item);
}