“对象不包含使用反射</field>的<field>”的定义

时间:2014-04-10 15:02:30

标签: c# reflection assemblies .net-assembly

我有一个库和控制台程序,可以动态加载.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); 
}

P.S。我编辑了代码。

2 个答案:

答案 0 :(得分:4)

如果您可以公开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)

  1. 您正在重复使用变量,因此您的代码甚至无法编译。
  2. 默认情况下,您的字段是私有的,因此尝试访问它而不指定BindingFlags.NonPublic将失败。 (您第二次添加标记但不是第一次添加标记)将其设为public

    public List<User> user;
    

    (你也可以通过添加{get; set;}使它成为一个属性但是因为在整个事情中我觉得这是一个反思的练习并没有太大的区别。

  3. 您正在将值转换为IList,因此在迭代它时,您只能看到object而不是User s。因此,尝试访问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); 
    }