如何为静态字段分配值动态创建对象?

时间:2016-05-29 08:47:10

标签: c# reflection

我想使用反射类PropertyCondition(in assembly UIAutomationClient.dll)创建一个对象。为了获得所需的类构造函数,我使用以下代码:

var assembly = AppDomain.CurrentDomain.GetAssemblies().First(x => x.FullName.Contains("AutomationClient"));

var propertyConditionType = assembly.DefinedTypes.First(x => x.Name == "PropertyCondition");
var automationElementType = assembly.DefinedTypes.First(x => x.Name == "AutomationElement");

var automationIdPropertyType = automationElementType.GetField("AutomationIdProperty").FieldType;
var constructor = propertyConditionType.GetConstructor(new Type[] { automationIdPropertyType, typeof(object) });

但是如何传递构造函数AutomationElement.AutomationIdProperty

谢谢。

2 个答案:

答案 0 :(得分:0)

我相信automationId is a string property。您需要的是找到接受constructor的{​​{1}}:

strings

或者您可以使用Activator.CreateInstance Method

  

CreateInstance(AppDomain,String,String,Boolean,BindingFlags,Binder,Object [],CultureInfo,Object [])

     

创建在其中指定名称的类型的实例   指定的远程域,使用命名的程序集和构造函数   最符合指定参数的。

答案 1 :(得分:0)

您缺少的步骤是一个简单的FieldInfo.GetValue调用,以获取您必须传递给构造函数的值。我重新组织了你的代码:

var automationIdPropertyField = automationElementType.GetField("AutomationIdProperty");

var automationIdPropertyType = automationIdPropertyField.FieldType;
var automationIdPropertyValue = automationIdPropertyField.GetValue(null);

var constructor = propertyConditionType.GetConstructor(new[] { automationIdPropertyType, typeof(object) });

var obj = constructor.Invoke(new[] {automationIdPropertyValue, ...});