2016-05-29 10 views
0

Ich möchte ein Objekt mit Reflektionsklasse PropertyCondition(in assembly UIAutomationClient.dll) erstellen. Um die gewünschte Klasse Konstruktor zu erhalten, verwende ich den folgenden Code:Wie kann man einem statischen Feld einen Wert zuweisen, um dynamisch Objekte zu erstellen?

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) }); 

Aber wie gehe ich in Konstruktor AutomationElement.AutomationIdProperty?

Vielen Dank.

Antwort

0

Der Schritt, den Sie verpassen, ist ein einfacher Aufruf FieldInfo.GetValue, um den Wert zu erhalten, den Sie in den Konstruktor übergeben müssen. Ich habe Ihren Code umstrukturiert:

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, ...}); 
+0

Vielen Dank, es hat geholfen. –

0

Ich glaube, dass automationId is a string property. Und was Sie brauchen, ist constructor finden, welche strings akzeptiert:

ConstructorInfo ctor = propertyConditionType.GetConstructor(new[] { typeof(string) }); 
object instance = ctor.Invoke(new object[] { automationId }); 

Oder Sie verwenden Activator.CreateInstance Method:

CreateInstance (AppDomain, String, String, Boolean, Binding, Binder, Object [], Culture, Objekt [])

Erstellt eine Instanz des Typs, dessen Name in der angegebenen Remotedomäne angegeben ist, wobei die benannte Assembly und der Konstruktor am besten verwendet werden Es sind die angegebenen Parameter.

+0

Ich öffnete die Assembly in einem Decompiler und ich denke, es gibt keinen Konstruktor, der eine Zeichenfolge dauert. – thehennyy

+0

Nein, PropertyCondition-Klasse hat folgende Konstruktoren: public PropertyCondition (AutomationProperty-Eigenschaft, Objektwert); public PropertyCondition (AutomationProperty-Eigenschaft, Objektwert, PropertyConditionFlags-Flags); –

+0

So könnte es sein, dass Sie als Parameter das ganze 'Automation Element' statt dessen 'id' übergeben sollten? https://msdn.microsoft.com/ru-ru/library/ms752331(v=vs.110).aspx –

Verwandte Themen