我有以下汇编,其中包含以下数据
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
属性。
我如何使用反射实现这一目标?
答案 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);
}