C# 反射 : Type cast method return value in specific type of object list

标签 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);

现在我想在 Data 类型列表中的 returnValue 上方进行类型转换并访问 FirstName 属性。

如何使用反射来实现此目的?

最佳答案

假设您编写的所有内容都有效

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

returnValue实际上是一个List<Data> ,但你不能强制转换它,因为在编译时编译器没有 Data 的类型信息类(class)。但自从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);
}

关于C# 反射 : Type cast method return value in specific type of object list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49686532/

相关文章:

c# - 序列化在运行时创建的类

c# - 想要在运行时在程序集内加载程序集?

c# - 使用 MSBuild 从命令行定义预处理器值

c# - GenericArguments[0], 'MvcApplication66.Controllers.HomeController+Info' , 在 'System.Nullable` 1[T ]' violates the constraint of type parameter ' T'

c# - 如何将附加属性绑定(bind)到 ComboBox 的 DisplayMemberPath?

c# - 解决此错误需要进行哪些基本检查-找不到类型或 namespace 名称

C# 获取调用程序集的父程序集名称

c# - Reflections - 当属性在 List<> 中时设置对象属性

c# - .NET 中 PadLeft() 和 PadRight() 的 R 等价物是什么?

c# - 如何在 C# 中检测 DLL 的进程退出