【问题标题】:C# Reflection : Type cast method return value in specific type of object listC#反射:在特定类型的对象列表中类型转换方法返回值
【发布时间】:2018-04-06 06:16:15
【问题描述】:

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

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 上方键入 cast 并访问 FirstName 属性。

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

【问题讨论】:

  • 现在我想在 'returnValue' 上方键入强制类型转换 强制类型转换是指为您提供List&lt;Data&gt; 引用的引用转换?你不能这样做,只有当你在编译时知道你显然不知道的类型时,它才有用/可用。你有一个没有静态类型信息的运行时对象(除了它是一个object)。您要么通过反射访问所有属性/方法,要么使用dynamic。两者本质上等同于同一件事:延迟或运行时绑定以及编译时的零类型安全,但您已经处于那个位置,所以并不是说情况变得更糟。
  • @InBetween 是的,正如你所说,除了我如何使用“returnValue”中的信息?例如,我想从列表中的所有对象中打印名字。
  • @InBetween 感谢您给我宝贵的时间。

标签: c# system.reflection


【解决方案1】:

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

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

returnValue实际上是一个List&lt;Data&gt;,但是你不能强制转换它,因为在编译时编译器没有Data类的类型信息。但是由于 List&lt;T&gt; 实现了 IList,您可以对其进行强制转换并迭代其项目(IEnumerable&lt;object&gt; 也应该可以工作)。

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

【讨论】:

  • 非常感谢您的回答。这正是我需要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多