![](/img/trans.png)
[英]Loading assembly with reflection - 'object' does not contain a definition for 'Description'?
[英]“object does not contain a definition for <field>” using reflection
我有一个库和控制台程序,可以动态加载.dll
文件。 在库中,我有一个List<User>
。 类User
存在于库中。 我想在我的foreach
列表中的每个用户,但我不知道该怎么做。
public class Class1
{
public List<User> user;
public Class1()
{
user = new List<User>() {
new User() { name = "Smith", age = 19 },
new User() { name = "Mitchell", age = 41 }
};
}
}
public class User
{
public String name;
public int age;
}
控制台程序的部分代码:
Assembly asm = Assembly.LoadFile(@"C:\TestLibrary.dll");
Type Class1 = asm.GetType("TestLibrary.Class1") as Type;
Type User = asm.GetType("TestLibrary.User") as Type;
var testClass = Activator.CreateInstance(Class1);
MemberInfo[] List = Class1.GetMember("user");
FieldInfo field = (FieldInfo)List[0];
MemberInfo[] List = Class1.GetMember("user", BindingFlags.Public | BindingFlags.Instance);
FieldInfo field = (FieldInfo)List[0];
var users = field.GetValue(testClass);
for (int i = 0; i < ((IList)users).Count; i++)
{
var us = ((IList)users)[i];
// How to show name and age?
// Console.WriteLine("User: {0}, Age: {1}", us.name, us.age);
}
PS我编辑了代码。
如果可以将user
公开,则:
var assembly = Assembly.LoadFile(@"C:\TestLibrary.dll");
var type = assembly.GetType("TestLibrary.Class1");
dynamic test = Activator.CreateInstance(type);
foreach(dynamic user in test.user)
Console.WriteLine("User: {0}, Age: {1}", user.name, user.age);
默认情况下,您的字段是私有的,因此尝试在不指定BindingFlags.NonPublic
的情况下访问它会失败。 (您第二次添加标志,但不是第一次添加标志)。将其public
:
public List<User> user;
(您也可以通过添加{get; set;}
将其设置为属性,但是由于在我看来,整件事似乎都是一种练习,因此并没有太大的区别。
您正在将值转换为IList
,因此在对其进行迭代时,您只会看到object
而不是User
。 因此,尝试访问us.name
将会失败。 您可以这样做:
for (int i = 0; i < ((IList)users).Count; i++) { var us = ((IList<User>)users)[i]; // How to show name and age? Console.WriteLine("User: {0}, Age: {1}", us.name, us.age); }
或简单地
foreach(User us in (IList<User>)users) { // How to show name and age? Console.WriteLine("User: {0}, Age: {1}", us.name, us.age); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.