2013-04-03 2 views
-1

Я пытаюсь создать экземпляр объекта, который также имеют классы, состоящие в него:Установленное значение составных классов с помощью отражения

[DataContract(Name = "share", Namespace = "")] 
public class RequestShareDocument 
{ 
    [DataMember(Order = 0)] 
    public string profile_name { get; set; } 
    [DataMember(Order = 1)] 
    public List<RequestSigner> signers {get; set;} 
    [DataMember(Order = 2)] 
    public bool createcopy { get; set; } 
} 

[DataContract(Name = "signer", Namespace = "")] 
public class RequestSigner 
{ 
    [DataMember(Order = 0)] 
    public string email { get; set; } 
    [DataMember(Order = 1)] 
    public string order { get; set; } 
    [DataMember(Order = 2)] 
    public string reminder { get; set; } 
    [DataMember(Order = 3)] 
    public RequestSignerPermissions permissions { get; set; } 
    [DataMember(Order = 4)] 
    public string signature_field { get; set; } 
} 

[DataContract(Name = "permissions", Namespace = "")] 
public class RequestSignerPermissions 
{ 
    [DataMember(Order = 0)] 
    public bool save_locally {get;set;} 
    [DataMember(Order = 1)] 
    public string open_password { get; set; } 
    [DataMember(Order = 2)] 
    public DateTime accessible_after { get; set; } 
    [DataMember(Order = 3)] 
    public DateTime accessible_before { get; set; } 
    [DataMember(Order = 4)] 
    public string certify_level { get; set; } 
} 

Мне нужно создать экземпляр класса и сериализации в XML, чтобы, но я не знаю, как это сделать?

Я могу создать экземпляр класса, но когда дело доходит до свойства List<T>, я не могу его создать. Я уже пробовал это:

if (typeof(IEnumerable).IsAssignableFrom(item.PropertyType)) 
    IList list = (IList)Activator.CreateInstance(typeof(List<>)); 

... и сериализации Я использую:

XmlSerializer mySerializer = new XmlSerializer(typeof(T), new 
    XmlRootAttribute(RootElementName));  
StringWriter sww = new StringWriter(); 
XmlWriter writer = XmlWriter.Create(sww, new XmlWriterSettings() 
    { OmitXmlDeclaration = true, Indent = true }); 
mySerializer.Serialize(writer, item); 
writer.Close(); 
sww.Close(); 

Проблема заключается в том, когда я петля все свойства и достичь List я не знаю, как создайте экземпляр List. Возможно ли, я делаю что-то неправильно?

+0

Пробовали ли вы это: 'если (TypeOf (IList) .IsAssignableFrom (item.PropertyType)) { IList список = (IList) Activator.CreateInstance (item.PropertyType); ' –

+0

Я уже устал, он создает экземпляр списка, но проблема в том, как я могу добавить объект класса, список которого создан. Список IList = (IList) Activator.CreateInstance (item.PropertyType); теперь я получаю объект списка со счетом 0 – Salman

ответ

1

Если я правильно понял, то этот код делает то, что вы хотите:

public static object InitializeTarget(Type type) 
    { 
     object target = CreateObject(type); 
     foreach (PropertyInfo propertyInfo in type.GetProperties()) 
     { 
      if (propertyInfo.PropertyType.IsClass && propertyInfo.CanWrite 
       && propertyInfo.PropertyType != typeof(string) 
       && (propertyInfo.IsDefined(typeof(DataMemberAttribute), true))) 
       propertyInfo.SetValue(target, InitializeTarget(propertyInfo.PropertyType), null); 
     } 
     return target; 
    } 

    public static object CreateObject(Type type) 
    { 
     if (typeof(IList).IsAssignableFrom(type) && type.IsGenericType) 
     { 
      Type[] genericArguments = type.GetGenericArguments(); 
      if (genericArguments.Length == 1) 
      { 
       var list = (IList)Activator.CreateInstance(type); 
       //Adding default value 
       list.Add(CreateObject(genericArguments[0])); 
       return list; 
      } 
     } 
     //If the object is only to serialize, you can use it 
     return FormatterServices.GetUninitializedObject(type); 
     //or 
     //   return Activator.CreateInstance(type); 
    } 
+0

Спасибо, он решил мою проблему :) Большое спасибо – Salman

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