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

C# 从Activator.CreateInstance对象获取变量/属性?,c#,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(); var-librar

以下是我的代码:

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();
var-library=Assembly.LoadFrom(libraryPath);
IEnumerable 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
}
var lib=Activator.CreateInstance(类型);
类型myType=lib.GetType();
IList props=新列表(myType.GetProperties());
foreach(PropertyInfo props in props)
{
//做有价值的事
}
“道具”总是空的


有什么帮助吗?

您的类没有指定任何属性。它们指定私有字段。这意味着:

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

当然,您也可以将类更改为具有公共属性。

您的类不指定任何属性。它们指定私有字段。这意味着:

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

当然,您也可以将类更改为具有公共属性。

您显示的不是属性而是字段,因此需要调用。对于私有字段等,您需要使用相应的调用。

您显示的不是属性,而是字段-因此您需要调用。对于私人字段等,您需要使用相应的

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

而且。。。在这种情况下,您不需要创建列表,是否确实需要创建列表?你可以直接使用数组,它总是返回一个副本。

我猜你的意思是

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


而且。。。在这种情况下,您不需要创建列表,是否确实需要创建列表?你只需要使用数组,它总是返回一个副本。

嗯,好吧,我明白了:)你是第一个,所以我接受你@现在你把我弄糊涂了。。。如果要访问属性,请使用
GetProperties
。。。如果要访问字段,请使用
GetFields
…我的示例不是我的代码,而是更简单的版本。在我的“真实”代码中,我的字段不是字符串/整数,而是其他对象!所以据我所知,我必须使用Field来获取我的对象,但我认为我必须使用Properties来获取string/ints/等等。。在我的领域,对吗?@guillaumecograne如果你有一个领域是一个对象。。。然后你需要调用对象上的
GetType()
,然后你需要调用
GetProperties
GetFields
,这取决于对象和你所追求的。。。用更复杂的“真实”代码问一个新问题(你甚至可以链接到这个问题)。。。不要忘记对任何有用的答案进行投票/打分。。。这是我的“最后”问题;)哼,好吧,我明白了:)你是第一个,所以我接受你@现在你把我弄糊涂了。。。如果要访问属性,请使用
GetProperties
。。。如果要访问字段,请使用
GetFields
…我的示例不是我的代码,而是更简单的版本。在我的“真实”代码中,我的字段不是字符串/整数,而是其他对象!所以据我所知,我必须使用Field来获取我的对象,但我认为我必须使用Properties来获取string/ints/等等。。在我的领域,对吗?@guillaumecograne如果你有一个领域是一个对象。。。然后你需要调用对象上的
GetType()
,然后你需要调用
GetProperties
GetFields
,这取决于对象和你所追求的。。。用更复杂的“真实”代码问一个新问题(你甚至可以链接到这个问题)。。。不要忘记对任何有用的答案进行投票/打分。。。这是我的“最后”问题;)好的,现在让我们考虑一下,我的字段是一个具有一定数量属性的类。如何通过“FieldInfo”访问它们?@GuillaumeCogranne:首先获取字段的值,然后使用
type.GetProperties
获取字段类型的属性,然后使用
prop.GetValue(fieldValue,null)
获取每个属性相对于该值的值。好的,现在让我们考虑一下,我的字段是一个具有一定数量属性的类。如何通过“FieldInfo”访问它们?@GuillaumeCogranne:首先获取字段的值,然后使用
type.GetProperties
获取字段类型的属性,然后使用
prop.GetValue(fieldValue,null)
获取每个属性相对于该值的值。好的,现在让我们考虑一下,我的字段是一个具有一定数量属性的类。我如何通过“FieldInfo”访问它们?正如我所说,要访问属性,必须使用PropertyInfo。要访问字段,您必须使用FieldInfo.Yep,但我必须访问字段中的属性!并且myField.GetType().GetProperties()为空。。。下面是我的问题的一个更详细的版本:好的,现在让我们考虑一下我的字段是一个具有一定数量属性的类。我如何通过“FieldInfo”访问它们?正如我所说,要访问属性,必须使用PropertyInfo。要访问字段,你必须使用FieldInfo.Yep,但我必须访问FieldInfo