从Activator.CreateInstance对象获取变量/属性?

时间:2011-11-07 10:49:46

标签: c#

这是我的代码:

public class Test
{
   string a;
   int b;
}

public class Test2
{
   string c;
   string d
   int e;
}

我正在将它编译为DLL并使用以下方法提取这两个类:

var library = Assembly.LoadFrom(libraryPath);
IEnumerable<Type> types = library.GetTypes();

然后“foreach type in types”,我想得到一个我的变量列表,但不知道该怎么做......我正在尝试:

var lib = Activator.CreateInstance(type);
Type myType = lib.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

foreach (PropertyInfo prop in props)
{
    // Do something with propValue
}

“道具”一直都是空的......

任何帮助?

3 个答案:

答案 0 :(得分:8)

您的课程未指定任何属性。他们指定私人领域。这意味着:

  • 您需要致电GetFields,而不是GetProperties
  • 您需要指定BindingFlags.NonPublic | BindingFlags.Instance,以便为您提供非公开实例字段

或者,您可以将类更改为具有公共属性。

答案 1 :(得分:2)

您展示的不是属性,而是字段 - 因此您需要致电myType.GetFields()。对于私人字段等,您需要使用相应的BindingFlags进行调用。

答案 2 :(得分:1)

我想你的意思是

var instance = Activator.CreateInstance(myType);
FieldInfo[] fields = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
    object value = field.GetValue(instance);

    // Do something with field value...
}

获取您需要使用GetFields的字段列表。

获取使用GetMethods的方法列表。

要获取需要使用GetProperties的属性列表。

获取使用GetEvents所需的事件列表。

而且......在这种情况下你不需要创建一个List,你确定需要创建一个列表吗?你可以使用数组,它总是返回一个副本。