2013-04-17 2 views
1

У меня есть один класс, как показано ниже. Я хочу отправить один Messageformat примерно для одного веб-сервиса, поэтому мне нужно добавить значения в Attributecollection и Input.Как добавить данные в класс в другом классе

public class Messageformat 
{ 
    public class Attributecollection 
    { 
     public string name { get; set; } 

     public int id { get; set; } 
    } 

    public class Input 
    { 
     public string soid { get; set; } 

     public string itemname { get; set; } 

     public int qty { get; set; } 
    } 

    public class output 
    { 
     public string soid { get; set; } 
    } 
} 

Я хочу добавить ценности к этому сорту. Я могу вызывать только один класс за раз и добавлять значения к этому классу. Есть ли способ вызвать класс Messageformat и добавить значения к подклассам через этот объект. Я знаю его вложенную структуру классов. Я плохо разбираюсь в этом, так может ли кто-нибудь поделиться с этим идеей?

+0

Не уверен, но эта вещь может быть достигнута ** Reflection **.Вам нужно записать код отражения, чтобы заполнить подклассы вашего класса. [Заполнение данных объектами с использованием Reflection] (http://www.c-sharpcorner.com/uploadfile/sridhar_subra/filling-data-objects-using-reflection/) –

ответ

1

Вы должны сделать каждый класс отдельным для определения. Тогда (WCF), вы будете иметь возможность создать свой DataContract и его указать его datamembers - свойства, вы, что для отправки в сообщениях:

[DataContract] 
    public class Messageformat 
    {  
    [DataMember] 
    public Attributecollection prop1; 
    [DataMember] 
    public Input prop2; 
    [DataMember] 
    public output prop3; 
    } 

    [DataContract] 
    public class Attributecollection 
    { 
    [DataMember] 
    public string name { get; set; } 
    [DataMember] 
    public int id { get; set; } 

    } 

    [DataContract] 
    public class Input 
    { 
     [DataMember] 
     public string soid { get; set; } 
     [DataMember] 
     public string itemname { get; set; } 
     [DataMember] 
     public int qty { get; set; } 
    } 

    [DataContract] 
    public class output 
    { 
     [DataMember] 
     public string soid { get; set; } 
    } 

Затем вы должны сгенерировать контракт на оказание услуг, где вы можете использовать класс

[ServiceContract] 
    public interface IService 
    { 
    [OperationContract] 
    SendMessage(Messageformat message); 
    } 
1

Почему вы так делаете это? Вместо того, чтобы гнездиться классы, объявлять классы на том же уровне и создать свойства внутри MessageFormat других классов т.е.

public class Messageformat 
    { 
    public Attributecollection AtrributeCollection{get;set;} 
    public Input Input{get;set;} 
    public output Output{get;set;} 
    } 
    public class Attributecollection 
    { 
    public string name { get; set; } 
    public int id { get; set; } 
    } 
    public class Input 
    { 
    public string soid { get; set; } 
    public string itemname { get; set; } 
    public int qty { get; set; } 
    } 
    public class output 
    { 
    public string soid { get; set; } 
    } 

Таким образом, вы можете легко создать объект MessageFormat и вставить данные всех трех других классов т.е.

[WebMethod] 
    public string GetMessage() 
    { 
     Messageformat msgFrmt = new Messageformat(); 
     msgFrmt.AtrributeCollection = new Atrributecollection() 
             { 
              name="test", 
              id=1 
             }; 

     msgFrmt.Input = new Input() 
          { 
           soid= "soid value", 
           itemname="item", 
           qty=10 
          }; 
     msgFrmt.Output = new output() 
          { 
           soid="soid value" 
          }; 

     return new JavaScriptSerializer().Serialize(msgFrmt); 
    } 

выше - простой пример, как вы можете организовать свои занятия и использовать их для любых целей. (выше пример веб-метода, но вы можете делать все, что хотите)

+0

Что делать, если я сделал «Список lmf = new List ();' Как его заполнить, чем? – Si8

1

Ваш вопрос не так понятен, но если вы спрашиваете, как заполнять данные, вам нужно будет добавить то, что называется . Свойства к вашему родительскому классу. Обратите внимание, что вам не нужно использовать внутренние классы.

public class Attributecollection 
{ 
    public string name { get; set; } 
    public int id { get; set; } 
} 

public class Input 
{ 
    public string soid { get; set; } 
    public string itemname { get; set; } 
    public int qty { get; set; } 
} 

public class output 
{ 
    public string soid { get; set; } 
} 

public class Messageformat 
{ 
    public Attributecollection MyAttributecollection { get; set; } 
    public Input MyInput { get; set; } 
    public output Myoutput { get; set; } 
} 

... 

Messageformat test = new Messageformat 
    { 
     MyAttributecollection = new Attributecollection { name = "", id = 1 }, 
     MyInput = new Input { soid = "", itemname ="", qty = 1 }, 
     Myoutput = new output { soid = "" } 
    }; 
1

судя/звуки этого, вы хотите экземпляр одного класса, который предоставляет свойства других:

public class Messageformat { 

    public MessageFormat() { 
    Attributes = new Attributecollection(); 
    Input = new Input(); 
    Output = new output(); 
    } 

    public Attributecollection Attributes { get; set; } 
    public Input Input { get; set; } 
    public output Output { get; set; } 
} 

public class Attributecollection { 
    public string name { get; set; } 
    public int id { get; set; } 
} 

public class Input { 
    public string soid { get; set; } 
    public string itemname { get; set; } 
    public int qty { get; set; } 
} 

public class output { 
    public string soid { get; set; } 
} 

Тогда вы можете сделать:

var format = new MessageFormat(); 
format.Input.soid = "something"; 
format.Input.itemname = "something"; 

И так далее. Конечно, здесь есть много улучшений, но, конечно, есть.

+0

Что делать, если я сделал «Список lmf = new List ();' Как его заполнить, чем? – Si8

1

Почему бы не сделать внутренний класс и его свойства статического в уровне доступа, как это:

class MessageFormat 
{ 
    public static class Attributecollection 
    { 
     public static string name { get; set; } 

     public static int id { get; set; } 
    } 

    public static class Input 
    { 
     public static string soid { get; set; } 

     public static string itemname { get; set; } 

     public static int qty { get; set; } 
    } 

    public static class output 
    { 
     public static string soid { get; set; } 
    } 
} 

И тогда вы могли бы получить доступ к внутренним классам, хотя без конкретизации:

MessageFormat.Attributecollection.id = 1; 
    MessageFormat.Attributecollection.name = "test"; 
    MessageFormat.Input.itemname = "Soda"; 
    MessageFormat.Input.qty = 10; 

Хотя он побеждает цель вложенного класса, потому что предположительно внутренний класс вложенного класса должен быть доступен только внешним или родительским классам. Но согласно вашему требованию этот код будет соответствовать этому требованию.

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