1

我有一个像下面这样的课程。我想Messageformat为一个 web 服务发送一个这样的,所以我需要将值添加到Attributecollectionand 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并通过该对象向子类添加值。我知道它是一个嵌套的类结构。我不擅长 oop 所以任何人都可以分享一些关于这个的想法吗?

4

5 回答 5

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;

尽管它违背了嵌套类的目的,因为据说嵌套类的内部类应该只能由外部类或父类访问。但根据您的要求,此代码将满足该要求。

于 2013-04-17T10:13:30.453 回答
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";

等等。可以肯定的是,这里有很多改进,但你已经有了。

于 2013-04-17T08:11:29.813 回答
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);
  }

上面是一个简单的例子,你可以如何组织你的类并将它们用于任何目的。(上面是一个 webmethod 的例子,但你可以做任何你想做的事)

于 2013-04-17T08:07:18.310 回答
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 = "" }
    };
于 2013-04-17T08:08:41.567 回答
1

您应该将每个类分开以进行定义。然后(WCF)你将能够创建你的 DataContract 并指定它的数据成员 - 属性,你在你的消息中发送什么:

  [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);
  }
于 2013-04-17T08:09:21.337 回答