繁体   English   中英

“对象不包含针对 <field> ”使用反射

[英]“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);
  1. 您正在重新使用变量,因此您的代码不会被编译。
  2. 默认情况下,您的字段是私有的,因此尝试在不指定BindingFlags.NonPublic的情况下访问它会失败。 (您第二次添加标志,但不是第一次添加标志)。将其public

     public List<User> user; 

    (您也可以通过添加{get; set;}将其设置为属性,但是由于在我看来,整件事似乎都是一种练习,因此并没有太大的区别。

  3. 您正在将值转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM