C#反射:特定类型的对象列表中的类型强制转换方法返回值

C#反射:特定类型的对象列表中的类型强制转换方法返回值,c#,system.reflection,C#,System.reflection,我有以下汇编,其中包含以下数据 demo.dll 一级 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>();

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

demo.dll

一级

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;
   }
}
现在我想在类型数据列表中键入cast over
returnValue
,并访问
FirstName
属性


如何使用反射来实现这一点?

假设您编写的所有内容都能正常工作

object returnValue = GetItems.Invoke(utility, null);
returnValue
实际上是一个
列表
,但是您不能强制转换它,因为在编译时编译器没有
数据
类的类型信息。但是由于
列表
实现了
IList
,您可以对其进行强制转换并迭代其项(
IEnumerable
也应该可以)

然后,您可以再次使用反射来访问
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);
}

现在我想通过cast在“returnValue”上方键入cast,您是指一个引用转换,它为您提供了一个
列表
引用?您不能这样做,只有在编译时知道类型时才有用/可用,而您显然不知道。您有一个没有静态类型信息的运行时对象(除了它是
对象
)。您可以通过反射访问所有属性/方法,也可以使用
dynamic
。两者本质上等同于一件事:后期或运行时绑定和编译时的零类型安全,但您已经处于这一点,所以这并不是说它变得更糟了。@在这两者之间,正如您所说的是,除了如何使用“returnValue”中的信息之外??例如,我想打印列表中所有对象的名字。@在此之间,谢谢你给我宝贵的时间。非常感谢你的回答。这正是我需要的
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);
}