我有以下汇编,其中包含以下数据
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/