2011-06-06 95 views
1

我有一个web方法,它调用DAL中的方法来通过id执行过程并返回MyData类型的对象。.NET的动态返回类型方法

[WebMethod] 
public MyData GetDataById(int id) 
{ 
    DAL myDAL = new DAL(); 
    return myDAL.GetDataById(id); 
} 

类迈德特如下所示

public class MyData 
{   
    public string Name; 
    public Data[] DataItems;  
} 

和类Data

public class Data 
{ 
    public string key; 
    public string value; 
} 

现在,这工作得很好,直到我们想回到一个有点复杂类型。

举一个例子,一个DataTable,或者类似的含纬度经度的结构(或类)。显然,类Data不能容纳多个值或一个DataTable。 (它包含两个字符串,键和值)。

所以我真正想要的是类型是通用的。所以,我把它改成...

public class MyData<T> 
{   
    public string Name; 
    public T[] DataItems;  
} 

所以我会做这样的事情myDAL.GetDataById里面的原因是什么类型的数据是根据类型不同返回。

if (GetTypeOfId(id) == "NormalData") 
{ 
    MyData<Data> result = new MyData<Data>(); 
} 
else if (GetTypeOfId(id) == "Map") 
{ 
    MyData<MapData> result = new MyData<MapData>(); 
} 

但我需要指定一个类型的方法签名,以及不幸的是只在运行时发现。

我该如何处理这种情况?

我觉得我使用泛型的东西,我不应该使用它。

或者通常情况下只在运行时发现类型的情况已解决?

更新:最糟糕的情况是有不同的Web服务调用来获取我想要避免的正常数据和地图数据。

+0

你需要指定哪种类型?你不能公开MyData GetDataById(int id)吗? – Cilvic 2011-06-06 12:24:25

+0

是的。对于Web服务调用以及DAL中的方法。 – 2011-06-06 12:25:37

+0

@Cilvic:你真的可以拥有一个通用的'WebMethod'吗? – Gabe 2011-06-06 12:33:14

回答

0

答案是相当简单和愚蠢的我不想以前。 我刚刚创建了一个父类,并创建了Data,并且所有其他所需的类都从它继承。

0

我不确定你在问什么,但我有一种感觉,使用一个泛型方法的接口可以帮助你传递返回值并调用GetValue泛型方法。

如果您使用IData而不是通用类型作为返回值,您将能够使用ret.GetValue<MyData>()提取嵌入数据。如果您在创建Data<T>时设置类型,您也可以查询。

也许你可以根据你的需要调整下面的代码片段。

public interface IData { 
    type Type { get; set; } 
    string Name { get; set; } 
    T GetValue<T>(); 
} 

public class Data<T> : IData 
{ 

    public Type Type { get; set; } 
    public string Name { get; set; } 
    public T Value { get; set; } 
    public Tret GetValue<Tret>() { 
     return (Tret)(Object)Value; 
    } 
} 
1

您只能在编译时指定类型的情况下使用泛型,所以我认为它们不适合您的情况。

我会建议有两个Web服务调用,这是处理这个问题的最简单方法。

如果你真的只想要一个web服务调用,你可以让你的web方法简单地返回一个byte [](使用BinaryFormatter创建)或一个字符串(使用XmlSerializer创建),然后在客户端反序列化,但这意味着您必须在双方都拥有相同的类(或者您必须具有自定义的反序列化代码),并且您的Web服务不能轻易被多个客户端使用。