2013-11-30 2 views
2

У меня есть служба wcf, динамически вызывающая wcf-сервис через wsdl-файл на клиенте. Теперь я хочу установить свойства метода в моей службе wcf. У меня были свойства, которые являются сложными типами, и у каждого сложного типа у меня было от 30 до 4 сложных типов. Я не могу прикоснуться к сервису, только вещь использует значения отражения отражения для службы datacontract и использует метод .Invoke (массив построенных массивов pass). Клиент будет передавать входные параметры для datacontract в словаре. Рекурсия должна перемещаться по внутренним классам complextype и устанавливать значения. Пример кода:Использование отражения для установки свойств для wcf datacontract

public CompositeType GetTestDataUsingDataContract(CompositeType composite, string str, int i,EmployeeIn obj) 
{ 
     ///code here 
} 
    **DataContract for CompositeType** 
     [DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string stringValue = "Hello "; 
    EmployeeIn employeeValue; 
    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string StringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
    [DataMember] 
    public EmployeeIn EmploValue 
    { 
     get { return employeeValue; } 
     set { employeeValue = value; } 
    } 
} 
    EmployeeIn Class 
     [DataContract] 
public class EmployeeIn 
{ 
    bool UserIsOnline = true; 
    string UserName = "DANGER"; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return UserIsOnline; } 
     set { UserIsOnline = value; } 
    } 

    [DataMember] 
    public string StringValue 
    { 
     get { return UserName; } 
     set { UserName = value; } 
    } 
} 

С помощью отражения Я хочу, чтобы установить эти свойства.

ответ

0

Вот рабочий код для настройки свойств с помощью отражения с именем свойства, представленное строкой:

void SetPropertyValue(object obj, string propertyPath, object value) 
{ 
    System.Reflection.PropertyInfo currentProperty = null; 
    string[] pathSteps = propertyPath.Split('/'); 
    object currentObj = obj; 
    for (int i = 0; i < pathSteps.Length; ++i) 
    { 
     Type currentType = currentObj.GetType(); 
     string currentPathStep = pathSteps[i]; 
     var currentPathStepMatches = Regex.Match(currentPathStep, @"(\w+)(?:\[(\d+)\])?"); 
     currentProperty = currentType.GetProperty(currentPathStepMatches.Groups[1].Value); 
     int arrayIndex = currentProperty.PropertyType.IsArray ? int.Parse(currentPathStepMatches.Groups[2].Value) : -1; 
     if (i == pathSteps.Length - 1) 
     { 
      currentProperty.SetValue(currentObj, value, arrayIndex > -1 ? new object[] { arrayIndex } : null); 
     } 
     else 
     { 
      if (currentProperty.PropertyType.IsArray) 
      { 
       currentObj = (currentProperty.GetValue(currentObj) as Array).GetValue(arrayIndex); 
      } 
      else 
      { 
       currentObj = currentProperty.GetValue(currentObj); 
      } 
     } 
    } 
} 

Теперь вы можете использовать эту функцию, чтобы установить такие свойства, как, например:

SetPropertyValue(someClass, "SomeInt", 4); 
SetPropertyValue(someClass, "ArrayProperty[5]/Char", (char)2); 
SetPropertyValue(someClass, "TestField", new SomeOtherClass()); 
+0

Hi Konrad , Я написал свой код, пожалуйста, предоставьте свои данные, – user3001558

+0

@ user3001558 обновите свой ответ в соответствии с использованием моей функции, если вы сочтете это полезным и хотите получить некоторые пояснения. –

+0

Спасибо, но я могу найти свой код и ваш код в потоке, отправить файл сжатого кода на ваш идентификатор, пожалуйста, укажите свой идентификатор почты. мы работаем над POC, интегрируя 50 diffr. wcf и веб-сервисы. Обеспечить общий золь. – user3001558

Смежные вопросы