c#在WCF运行时创建动态类/属性

时间:2012-10-04 19:42:31

标签: c# wcf silverlight list reflection

这些是我需要写的方法:

List<Test> test = new List<Test>();
public List<Test> GetData(int ReportId)
     {
       StringBuilder qr = new StringBuilder();
       StringBuilder SQL = new StringBuilder();
       DataTable dt;

    qr.AppendLine(" select SQL");
    qr.AppendLine(" from  V_REPORT_SQL f");
    qr.AppendLine(String.Format(" where REPORT_ID = '{0}'", ReportId));

   dt = DataManager.GetDatadt(qr);
      foreach (DataRow dr in dt.Rows)
         {
           SQL.Append(dr[0].DBStr());
         }

        dt = DataManager.GetData(SQL);
        foreach (DataRow dr in dt.Rows)
         {
        Test t = new Test()
        {
         can i dynamically create and iterate over the properties and assign the datarow? 
        };

        test.Add(t);
    }
    return test;

    }

//这是DataContract

 [DataContract]
    public class Test
    {  
    }

表V_Report_SQL

reportid | SQL
1        | select id,Name from table1
2        | select acctid,Name,date from table2
3        | select Name,location,date,XX,XX,XX from table3

我想解决的问题是我发送reportid动态获取sql然后我传递sql并获取DataTable中的数据。现在我需要将其发送为list<Test>。我可以动态创建类Test的属性。 例如:

     for report id 1

     [DataMember]
     public int Id { get; set; }

     [DataMember]
     public string Name { get; set; }

     for report id 2 

     [DataMember]
     public int acctid { get; set; }

     [DataMember]
     public string Name { get; set; }

     [DataMember]
     public DateTime date { get; set; }

使用该服务的客户端应用程序基于Silverlight 4构建。

如果我不清楚,请告诉我,我可以更新它。我不确定我选择解决的路线。有没有其他方法可以解决这个问题。

更新

我已更新,我不再使用动态,不确定此路线是否会解决。

2 个答案:

答案 0 :(得分:1)

通常,尝试在Web服务中使用特定于平台的类型是一个坏主意。例如,您不希望Java理解DataTable类型。

我怀疑您在尝试返回dynamic对象时会遇到同样的问题。这甚至不能通过服务的WSDL来描述,所以我怀疑任何调用者都不知道如何处理这样的返回值。

事实上,我不知道该服务甚至会将这样的事情序列化。

答案 1 :(得分:1)

我认为你的意图是高尚的,但实际上你会创造一个不断变化的网络服务。谁会用它?如果我是你,我会返回以下对象之一:

  1. 2D字符串表(第一行是一系列标题和 剩下的将分别存储值)
  2. 1D字符串表(属性名称 - 属性值对)
  3. 字符串(CSV文件的平面内容)
  4. 二进制CSV
  5. 您必须在客户端抓取的动态XML
  6. 假设您只关心文本值,我显然可能是错的,但由于您使用的是报表,我认为这种情况很可能存在。

    希望这有帮助, 彼得